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 可以用在任何力度的级别中,从局部变量到整个类,但你应该尽量用在可能小的范围内

 

posted @   shog808  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2020-02-21 shell脚本自动化部署
点击右上角即可分享
微信分享提示