泛型初识
: 注意
泛型有子类型化的规则,List是原生态类型List的一个子类型,List也是,但是List并不是List的子类型,即便看起来它们"相等"。举个栗子:
public class Test{
public static void main(String[] args){
List<String> strs = new ArrayList<String>();
unsafeAdd(strs,new Integer(20));
String s = strs.get(0); //编译没问题,运行时会出错ClassCastException
}
public static void unsafeAdd(List<Object> list,Object o){
list.add(o);
}
}
解决这种问题,似乎只要将子类型改为原生类型就可以了,但是无疑很危险,这时候就用到了无限制的通配符类型
无限制通配符类型
: 如果不确定参数类型,那就使用?,例如List<?>
这样也会有新的问题出现,由于不确定参数类型,你可以放一个Integer也可以放入String,这就违背了该集合的类型约束条件。怎么解决呢?
泛型方法/有限制的通配符类型
: 待学习。。。
问题思考:
//fail on runtime
Object[] o = new Long[1];
o[0] = "hello";
//will not compile
List<Object> list = new ArrayList<Long>();
list.add...
附录:
术语 | 示例 |
---|---|
参数化类型 | List<String> |
实际类型参数 | String |
泛型 | List<E> |
形式类型参数 | E |
无限制通配符类型 | List<?> |
有限制通配符类型 | List<E extends Number> |
原生类型 | List |
递归类型限制 | <T extends Comparabel<T>> |
泛型方法 | static <E> List<E> asList(E[] a) |
类型令牌 | String .class |
`