Java中的泛型
Posted shog808
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的泛型相关的知识,希望对你有一定的参考价值。
1.术语介绍
参数化的类型 | List<String> |
实际类型参数 | String |
泛型 | List<E> |
形式类型参数 | E |
无限制通配符类型 | List<?> |
原生态类型 | List |
有限制类型参数 | <E extends Number> |
递归类型限制 | <T extends Comparable> |
有限制通配符类型 | List<? extends Number> |
泛型方法 | static <E> List<E> asList(E[] a) |
类型令牌 | String.class |
2.为什么使用泛型而不要使用原生态类型
- 直接地说,不使用泛型会出现运行时异常,而使用泛型,有问题编译时就会被编译器发现。
- Java1.5版本之前,没有泛型,从集合中读取的每一个对象都必须进行转换
- 如果一不小心插入了类型错误的对象,编译时不会被发现,运行时转换会出错
//使用泛型,告诉编译器list1里只能放入String类型 List<String> list1 = new ArrayList<>(); list1.add(new String("abc"));//不报错 list1.add(new Integer(1));//编译器报错,编译不通过 //使用原生态类型, List list2 = new ArrayList(); list2.add(new String("abc"));//不报错 list2.add(new Integer(1));//不报错
如果你使用了泛型,就等于告诉编译器,我这个集合就放这种类型,你给我盯着点,如果我忘了,往里面添加别的类型你要阻止我!
一句话,可以让编译器帮你检查类型错误。
因此,我们声明集合时要尽量使用泛型,能最大地减少类型错误。(新写的代码都要用泛型)
那么为什么编译器不强制我们使用泛型呢?原因是,泛型是jdk1.5才提出来的,允许原生态和泛型并存只是为了兼容引入泛型之前的代码,毕竟到jdk1.5时已经有很多项目在使用Java了。
3.有哪些地方必须使用原生态呢
- 在类类型中必须使用原生态
- List<String.class>、List<?>.class,都是不合法的;List.class、String[].class、int.class,是合法的
- 关键字 instanceof
- o instanceof Set 合法;
总之,使用原生态类型在运行时会导致异常,因此在新代码中要使用泛型
4.消除非受检警告
消除所有警告,就可以确保代码是类型安全的,意味着运行时不会出现ClassCastException。
# 会有警告 List<Monkey> monkeys1 = new ArrayList(); # 消除警告 List<Monkey> monkeys2 = new ArrayList<Monkey>(); #或者如下 List<Monkey> monkeys3 = new ArrayList<>();
- 如果无法消除警告,同时可以证明引起警告的代码是类型安全的,可以用 @SuppressWarning("unchecked") 注解来禁止这条警告
但是请不要随便用,你确保真的没有类型安全问题时才用,不然运行时还是会报错;
如果你忽略警告,也不检查类型问题也不加注解,那么新出现的警告就会淹没在众多错误警告中
- SuppressWarning 可以用在任何力度的级别中,从局部变量到整个类,但你应该尽量用在可能小的范围内
stay hungry stay foolish!
以上是关于Java中的泛型的主要内容,如果未能解决你的问题,请参考以下文章