黑马程序员技术交流社区

标题: java泛型通配符理解不了啊 [打印本页]

作者: 杨震    时间: 2012-9-14 10:18
标题: java泛型通配符理解不了啊
Pair<T extends B>和Pair<? extends B>有什么区别啊,始终看不懂,谁有这方面好的文章介绍哈,或者详细讲下
作者: 尤圣回    时间: 2012-9-14 10:24
? extends A 是 java.lang.reflect.WildcardType
?号表示一个未知的类型。你可以认为是任意的类。
? extends A 意思就是 任意继承自A的类

这是List中的元素类型的范围问题,List<T extends A>其实就是List<T>, List中的元素只能是T的一个对象。
List<? extends A>定义的变量包含的元素可以是A的对象,也可以是A的子类的对象。


比如有
class A{}
class B extends A{}
class T extends B{}
可以定义List<T> list1= new ArrayList();
list1.add(new T());  list1.add(new T()); list1.add(new T());  //List中现在有三个元素。
list1.add(new A());     //这种用法不正确

另 List<? extends A> list2 = new ArrayList();
list2.add(new A());   list2.add(new B());   list2.add(new T());   //List中也有三个元素,用法是正确的
作者: 朱烈葵    时间: 2012-9-14 10:26
Pair<T extends B>和Pair<? extends B>有什么区别啊?

我觉得没啥区别,可能就是T需要被定义类型,而?是java提供的不需要定义,代表任意类型
作者: 李菁    时间: 2012-9-14 10:33
T是用来声明类型持有者名称。
?默认是允许Object及其下的子类,就是java中所有的对象。
?定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。
作者: 李志群    时间: 2012-9-14 10:47
通配符的应用:       
                集合中使用的注意特点:保证两边一致。简单的定义方式就是保证两边类型一致,但是也有其他情况。
                泛型的通配符:?  类型不匹配时候用。当操作不同容器中类型都不确定的时候,而且使用的都是元素的从Object类中继承的方法。
                这时泛型就用通配符?来表示即可。

泛型的限定:
                明确具体类型代表一个类型,明确?代表所有类型,
                能不能对操作的类型限制在一个范围之内呢?
               
                比如:定义一个功能,只操作person类或者person子类型。这时可以用? 继承 E接收e类型或者E的子类型。
                存储时候就用这种方式。这就是上限。
                下限的表示形式: ? super E;接受E类型或者E的父类型。
                                               
        什么时候使用上限呢? 一般情况下,只要是往容器中添加元素时,使用上限 ? extends         E
        什么时候使用下限呢?一般情况下,只要是从容器中取出元素时,使用下限 ? super E       
作者: 杨震    时间: 2012-9-14 10:51
尤圣回 发表于 2012-9-14 10:24
? extends A 是 java.lang.reflect.WildcardType
?号表示一个未知的类型。你可以认为是任意的类。
? extend ...

比如说下面这个

? extends Employee getFirst();
void setFirst(? extends Employee);

为什么说可以调用getFirst,而不能调用setFirst,书讲的是:
编译器只知道需要某个Employee的子类,但不知道具体是什么类型,所以不能传入 任何特定的类型

这句话不明白啊,不是讲了setFirst需要一个子类型,为什么传入一个子类型又不行呢?


作者: 尤圣回    时间: 2012-9-14 10:58
杨震 发表于 2012-9-14 10:51
比如说下面这个

? extends Employee getFirst();

? extends Employee getFirst();
  void setFirst(? extends Employee);
    setFile方法是不能被调用的,编译器只知道它需要某个Employee的子类型,但不知道具体是什么类型,它拒绝传递任何具体类型──?不是用来匹配的。getFile方法是可以调用的,可以将getFile方法的返回值赋给一个Employee引用。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2