泛型
引子
ArrayList al = new ArrayList ();
al.add("abc");
al.add("hahah");
al.add(4);
Iterator it = al.iterator();
while(it.hasNext()){
String str = (String)it.next();
System.out.println(str);
}
当调用某一类型自身特有的方法的时候就会出现异常
..... while(it.hasNext()){ String str = (String)it.next(); System.out.println(str.toUpperCase()); }
那么怎么办,只有程序员主观控制。我们实际开发是面向接口的开发。
- 那么,自己的程序,可以可以控制,可是,对方不知道你具体要什么数据啊。
- 所以,在编译的时候是通过的,但是一运行就会出现异常。
在jdk1.5提出了解决方案。怎么办呢?
是不是应该在定义容器的时候,明确容器里面要放的数据类型。
ArrayList<String> al = new ArrayList<String>(); al.add("abc");//public boolean add(Object obj) al.add("hahah"); //al.add(4);// 编译时会检测类型,提示错误。 ...
概述
- 泛型: jdk1.5出现的安全机制。约定了集合中元素的数据类型
- 好处: 将运行时期的问题ClassCastException转到了编译时期。
常见符号
E Elements 类或接口
T Type 代表具有指定类型,并可以进行特有操作
K Key
V Value
? Object 不进行特有操作的时候
- 其实他们都是Object类型
泛型限定问题
限制了类型的上界
A extends B C extends B B extends D <? extends T> 表示限制了类型的上界,表示参数化类型的可能是T 或是 T的子类 <? extends B> ? 代表的是只能使用B或B的子类 ===B A C
限制了类型的下界
A extends B B extends C D extends A <? super T> 表示限制了类型下界,表示参数化类型可能是T 或是 T父类,直至Object <? super A> ? 代表的是只能使用A或A的父类 ==>A B C