前言:
如何通过泛型,消除Type safety
的警告,使得代码更优雅?本文将介绍Java对象的三种类型,了解三中类型的区别,根据情境,灵活运用。
一.原始类型
List<>
为原始类型,但不指定元素类型,会出现不安全的警告:List is a raw type. References to generic type List<E> should be parameterized
,意思为:List是原始类型。List的泛型类型的引用应该被参数化。就是让人指定清楚是那种类型(如:Integer、String)
private void addObjIntoList1(List list, Object obj) {
list.add(obj);//出现警告,但编译能通过,能运行
}
为了消除警告,往往使用注解@SuppressWarnings("unchecked")
来关闭警告,但更优雅的办法是通过泛型。
二.泛型
List<T>
为泛型,对于List中元素不确定时候,应使用泛型,保证安全性。
推荐使用以下写法消除Type safety
类型安全的警告。
private <T extends Object>void addObjIntoList(List<T> list, T obj) {
list.add(obj);没有警告,编译能通过,也能运行
}
三.无限通配类型
以Set
为例,Set
是原始类型,Set<?>
就是无限通配类型。
注:List<?>
一般只用于读取情景中,不能add
增加元素,除非是null
。
以下代码list.add(obj)
会报错: The method add(capture#1-of ?) in the type List<capture#1-of ?> is not applicable for the arguments (Object)
private void addObjIntoList2(List<?> list, Object obj) {
list.add(obj);//编译不通过,不能运行
}