关于Java6 泛型的一点讨论

 

在JAVA5中加入了泛型,以在编译时就可以控制类型```

程序代码
package cn.pior.jdk5Test;
import java.util.List;
public class genericTest<T1 extends List<String>> {
private T1 a;
public T1 getA() {
return a;
}
public void setA(T1 a) {
this.a = a;
}
public genericTest(T1 t) {
setA(t);
}
public genericTest() {
setA(null);
}
}
 
程序代码
package cn.pior.jdk5Test;
import java.util.AbstractList;
public class genericChildTest<T extends AbstractList<String>> extends genericTest<T> {
}
 

上面是两个泛型类的定义``

genericTest定义泛类型只能为List<String>类或继承了List<String>的子类``

genericChildTest又进一步定义了泛类型只能为AbstractList<String>类或继承了AbstractList<String>的子类``

下面是一段应用的例子`:

程序代码

genericChildTest<? extends ArrayList<String>> g1 = null;
   genericChildTest<ArrayList<String>> g2 = new genericChildTest<ArrayList<String>>();
   ArrayList<String> al = new ArrayList<String>();
   al.add("e");
   g2.setA(al);
   
   g1= g2;
   g1.setA(al);
 

在最后的一句   g1.setA(al);``在编译时会报错如下:

程序代码
The method setA(capture#2-of ? extends ArrayList<String>) in the type genericTest<capture#2-of ? extends ArrayList<String>> is not applicable for the arguments (ArrayList<String>)

也就是说``在定义   genericChildTest<? extends ArrayList<String>> g1 = null;时`虽然限定了这泛类型必须是 ArrayList<String>或其子类`但`还是无法确定到底是哪个子类```所以这里的setA()方法还是无法正常使用``

 

你可能感兴趣的:(关于Java6 泛型的一点讨论)