名词定义
-
泛型类型(generic type)
如果一个类或者接口,声明了一个或者多个类型参数,那么这个类称为泛型类,接口称为泛型接口,它们都统称为泛型类型
例如List ,E为形式类型参数(形参),表示列表中元素的类型。 -
参数化类型(parameterized types)
类或接口名称,后面加上<>, 同时在<>里面列出实际的类型参数
例如 List< String >, String为实际类型参数(实参) -
原始类型(raw type)
每个泛型类型同时定义了一个原始类型,即没有任何类型参数
例如 List
条目1 不要使用原始类型
使用泛型会使代码更安全,更易懂
原始类型的存在,只是为了保持向前兼容
问题: 当不使用原始类型的情况下,元素为任何类型的容器该如何表示呢?
答案:使用Object作为实际类型参数
例如List< Object >
List< Object >和List的区别
你可以把List< String>作为参数,传递给一个参数类型为List的方法;
但是不能把List< String >作为参数,传递给一个参数类型为List< Object >的方法
这是因为List< String >是List的子类, 但不是参数化类型List< Object >的子类
问题:当容器的参数类型是未知的,如何声明其类型?
答案:使用类型通配符 ?
例如List<?>
下面的方法,即可以接受List< String >作为其参数,也可以接受List< Integer >作为其参数
void foo(List<?> list)
使用通配符的容器与原始类型的区别:
通配符容器是类型安全的,但是原始类型不是
- 原始类型容器可以添加任何对象;
- 通配符容器只能添加null,其他任何对象都不能添加进容器;否则会破坏容器的类型一致性
需要使用原始类型的地方
- instanceof关键字
if( o instanceof List)
不能写成 if (o instanceof List< String >)
注意,if (o instanceof List<?>)虽然合法,但是和if( o instanceof List) 是一样的 - class语法
List.class是合法的
但是List< string >.class是非法的