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中的泛型的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中的泛型类是啥东西?

Java中的泛型

java中的泛型 求详细解释

Java开发知识之Java中的泛型

java泛型中的下限

Java语言中的泛型