黑马程序员技术交流社区

标题: 求助,百思不得其解 [打印本页]

作者: 张明    时间: 2012-10-6 21:48
标题: 求助,百思不得其解
本帖最后由 张明 于 2012-10-6 22:21 编辑
  1. List<? extends Person> al = new ArrayList<Person>();
  2. al.add(new Person("张三", 20));
复制代码
一个Person类,类下有String name;和int age;
另外,有一Student类继承于Person类,也就是Person的子类
使用extends 报错,当extends换成super时,成功运行,百思不得其解
在这里,<? extends Person>和<? super Person>,到底该怎么理解
原意是想new ArrayList<Student>();后来想子类做父类使用也可以,就换成了Person,请大家两种类都试一试
关于这里的extends和super,跪求详细解释
作者: chjxs    时间: 2012-10-6 21:55
本帖最后由 chjxs 于 2012-10-6 21:57 编辑

<? extends Person> ? 最大不超过person类。也就是Person的子类。
<? super Person>   ?最少是person的父类。

2个都包含person类。
作者: 古银平    时间: 2012-10-6 22:03
泛型的限定;
? extends E: 可以接收E类型或者E的子类型。上限。
? super E: 可以接收E类型或者E的父类型。下限

作者: 焦晨光    时间: 2012-10-6 22:04
本帖最后由 焦晨光 于 2012-10-6 22:08 编辑

这是泛型上限和下限的意思
<? extends Person>,是泛型上限限定,意思是Person类及Person的子类都可以接收
<? super Person>,是泛型的下限限定,意思是Person的和Person的父类都可以接收

建议楼主看关于 泛型限定 方面的介绍。
作者: 张明    时间: 2012-10-6 22:16
chjxs 发表于 2012-10-6 21:55

谢谢,谢谢.终于明白了
作者: 张明    时间: 2012-10-6 22:16
古银平 发表于 2012-10-6 22:03
泛型的限定;
? extends E: 可以接收E类型或者E的子类型。上限。
? super E: 可以接收E类型或者E的父类型 ...

谢谢,谢谢.终于明白了
作者: 张明    时间: 2012-10-6 22:17
焦晨光 发表于 2012-10-6 22:04
这是泛型上限和下限的意思

谢谢,谢谢.看了之后,茅塞顿开,终于明白了

作者: 黑马连家华    时间: 2012-10-6 22:17
关于泛型限定,我是这么记忆的,楼主看看能不能帮到你
?相当于一个通配符
? extends Person 就是说我们要限定的类型是 ? ,而这 ? 必须是 Person的子类或者本类,好好想想就知道这是在限定了上限
? super Person同上
作者: 张明    时间: 2012-10-6 22:20
黑马连家华 发表于 2012-10-6 22:17
关于泛型限定,我是这么记忆的,楼主看看能不能帮到你
?相当于一个通配符
? extends Person 就是说我们要限定 ...

楼上已经解释很清楚了,你也看看吧
作者: 谭立文    时间: 2012-10-6 22:20
泛型中的?通配符


定义一个方法打印一个集合中的内容


总结:
使用?通配符可以引用其他各种参数化的类型
,?通配符定义的变量主要用作引用,可以调用与参数化
无关的方法,不能调用与参数化有关的方法。


通配符扩展


限定通配符的上边界


Vector<? extends Number> x = new Vector<Integer>;正确
Vector<? extends Number> x = new Vector<String>;错误

限定符下边界

Vector<? super Integer> x = new Vector<Number>;正确
Vector<? super Integer> x = new Vector<Byte>;错误

Vectror<?> x;
Vector<Integer> y;

x = y;  可以;
y = x;不可以

作者: 张明    时间: 2012-10-6 22:23
谭立文 发表于 2012-10-6 22:20
泛型中的?通配符

谢谢回复,已经明白了
作者: 孙含庆    时间: 2012-10-6 23:14

泛型的 <? extends T> 和 <? super T> 的确很容易让人晕晕的,相比 extends 的用法,super 就没那么晕,只要是本类和本类的父类

都可以add 进去。至于 extends 需要多想想的,他说的是一种子类,但是不知道是什么子类,一用 add 就出错。要看仔细定义时的

左右两边,小心使用。

class Person
{
        String name;
        int age;
}
class Student extends Person
{
}
class  
{
        public static void main(String[] args)
        {
                List<? extends Person> al = new ArrayList<Person>(); // 表示所有Person泛型的List的父类,这里还没有问题

                                                                //所应该持有的对象是Person的子类,而且具体是哪一个   
                                                                //子类还不知道,所以加入任何Student的子类都会有问题

                al.add(new Person("张三", 20)); //错了, al所持有的对象上限为Person,但是他不知道具体持有的对象类型,

                al.add(new Student()); //这样也错,al所持有的对象上限为Person,还是不知道具体持有的对象类型,

                List<Person> al1 = new ArrayList<Person>(); //或者不用通配符

                al1.add(new Person("张三", 20)); //是同一类型,肯定OK

                List<? super Person> al2 = new ArrayList<Person>(); // al持有的对象为Person的父类,下限为Person

                al2.add(new Person("张三", 20)); // 可以加入Person及Person的子类

                al2.add(new Student());

                //或者你这样

                List<? super Student> al3 = new ArrayList<Person>(); //al3持有对象为Student的父类,下限是Student
               
                al2.add(new Person("张三", 20)); // 这样是错的,虽然持有对象为Student的父类,但是容器不知道具体的类型是父类还是子类,                                                                                 // 所以不能放入父类

                al2.add(new Student()); //OK,放入子类是没有问题的
        }
}
作者: AngieFans85    时间: 2012-10-7 11:45
"使用extends 报错,当extends换成super时,成功运行,百思不得其解"

class Stundet extends Person {

}
类继承类,只能用extends关键字.



"在这里,<? extends Person>和<? super Person>,到底该怎么理解"

<? extends Person>指容器中可以存放Person对象或Person的子类对象.
<? super Person>指容器中可以存放Person对象或Person的子类对象.
作者: AngieFans85    时间: 2012-10-7 13:14
孙含庆 发表于 2012-10-6 23:14
泛型的

非常好,对泛型的研究很透彻,应该加分才对.
作者: 张明    时间: 2012-10-7 21:14
孙含庆 发表于 2012-10-6 23:14
泛型的

谢谢你的回复,我得好好研究啦




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