A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张明 中级黑马   /  2012-10-6 21:48  /  2030 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张明 于 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,跪求详细解释

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

14 个回复

倒序浏览
本帖最后由 chjxs 于 2012-10-6 21:57 编辑

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

2个都包含person类。
回复 使用道具 举报
泛型的限定;
? extends E: 可以接收E类型或者E的子类型。上限。
? super E: 可以接收E类型或者E的父类型。下限
回复 使用道具 举报
本帖最后由 焦晨光 于 2012-10-6 22:08 编辑

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

建议楼主看关于 泛型限定 方面的介绍。
回复 使用道具 举报
chjxs 发表于 2012-10-6 21:55

谢谢,谢谢.终于明白了
回复 使用道具 举报
古银平 发表于 2012-10-6 22:03
泛型的限定;
? extends E: 可以接收E类型或者E的子类型。上限。
? super E: 可以接收E类型或者E的父类型 ...

谢谢,谢谢.终于明白了
回复 使用道具 举报
张明 中级黑马 2012-10-6 22:17:09
7#
焦晨光 发表于 2012-10-6 22:04
这是泛型上限和下限的意思

谢谢,谢谢.看了之后,茅塞顿开,终于明白了
回复 使用道具 举报
关于泛型限定,我是这么记忆的,楼主看看能不能帮到你
?相当于一个通配符
? extends Person 就是说我们要限定的类型是 ? ,而这 ? 必须是 Person的子类或者本类,好好想想就知道这是在限定了上限
? super Person同上
回复 使用道具 举报
张明 中级黑马 2012-10-6 22:20:08
9#
黑马连家华 发表于 2012-10-6 22:17
关于泛型限定,我是这么记忆的,楼主看看能不能帮到你
?相当于一个通配符
? extends Person 就是说我们要限定 ...

楼上已经解释很清楚了,你也看看吧
回复 使用道具 举报
泛型中的?通配符


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


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


通配符扩展


限定通配符的上边界


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:20
泛型中的?通配符

谢谢回复,已经明白了
回复 使用道具 举报

泛型的 <? 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,放入子类是没有问题的
        }
}

评分

参与人数 1技术分 +1 收起 理由
王海宇 + 1

查看全部评分

回复 使用道具 举报
"使用extends 报错,当extends换成super时,成功运行,百思不得其解"

class Stundet extends Person {

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



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

<? extends Person>指容器中可以存放Person对象或Person的子类对象.
<? super Person>指容器中可以存放Person对象或Person的子类对象.
回复 使用道具 举报
孙含庆 发表于 2012-10-6 23:14
泛型的

非常好,对泛型的研究很透彻,应该加分才对.
回复 使用道具 举报
孙含庆 发表于 2012-10-6 23:14
泛型的

谢谢你的回复,我得好好研究啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马