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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沈样 黑马帝   /  2012-2-28 09:52  /  2433 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 沈样 于 2012-2-28 12:14 编辑

<? super XXX>是不是xxx的所有父类都可以,那我传object应该也可以,他是所有的父类,那不是说这个参数什么都能传,<? extends YYY>这个是传YYY的子类还好理解,就是前面的super不太理解,能不能控制不传入Object对象,有没有高人解释一下,小弟求教了

该贴已经同步到 沈样的微博

6 个回复

倒序浏览
<? super XXX>表示只能接受XXX和XXX的父类,即下限;<? extends YYY>这个是传YYY的子类,即上限;至于楼主说的Object,那是泛型出现以前java的做法。比如
public void print(Object o)
{
     system.out.println(o);
}
pringt方法中的参数可以接受所有的类型
回复 使用道具 举报
这个我具体举个例子吧,如下:
//Apple Orange 都继承自Fruit类,同时Jonathan是Apple的子类   
List<? extends Fruit> list = new ArrayList<Apple>();   
//list.add(new Apple());   
//list.add(new Fruit());   
   
List<? super Fruit> list = new ArrayList<Apple>();   
list.add(new Apple());//可以   
list.add(new Fruit());//可以   
   
List<? extends Fruit> list = new ArrayList<Apple>();   
list中为什么不能加入Fruit类和Fruit类的子类呢,原因是这样的   
    List<? extends Fruit>表示上限是Fruit,下面这样的赋值都是合法的   
    List<? extends Fruit> list1 = new ArrayList<Fruit>();   
    List<? extends Fruit> list2 = new ArrayList<Apple>();   
    List<? extends Fruit> list3 = new ArrayList<Jonathan>();   
    如果List<? extends Fruit>支持add方法的方法合法的话   
    list1可以add Fruit和所有Fruit的子类   
    list2可以add Apple和所有Apple的子类   
    list3可以add Jonathan和所有Jonathan的子类   
    这样的话,问题就出现了   
    List<? extends Fruit>所应该持有的对象是Fruit的子类,而且具体是哪一个   
    子类还是个未知数,所以加入任何Fruit的子类都会有问题,因为如果add Apple   
    的话,可能List<? extends Fruit>持有的对象是new ArrayList<Jonathan>()   
    Apple的加入肯定是不行的,如果 如果add Jonathan   
    的话,可能List<? extends Fruit>持有的对象是new ArrayList<Jonathan的子类>()   
    Jonathan的加入又不合法,所以List<? extends Fruit> list 不能进行add   
   
      
    而List<? super Fruit> list 表示list持有的对象是Fruit的父类,下限是   Fruit,所以list中add Fruit或Fruit的子类是没有问题的   
回复 使用道具 举报
我是这么认为的。你说的Object是所有类的父类没有错。所以Object可以传进去。而不是XXX的父类的类肯定是不行了,Object可以代表所有类的父类。并不是说所有的类都是Object,不知道我说明白了么??
回复 使用道具 举报
“?”代表未知类型
extends关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或者是此类型的子类
super关键字声明了类型的下界,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object
你的问题 是<? super XXX>既然能接受Object类,那么什么对象都可以接受了,对吧,可以这么理解,但最好不要这么做,
因为这里要求的是与程序需要的类型是“指定的”,是有内在关联的。
回复 使用道具 举报
本帖最后由 沈样 于 2012-2-28 11:42 编辑

我只是觉得如果用<? super XXX>这样还是有安全问题
public class SuperTest
{
        public static void main(String[] args)
        {
                ArrayList<Object> arr = new ArrayList<Object>();
/*                arr.add(new Student(10, "a"));
                arr.add(new Student(11, "ac"));
                arr.add(new Student(9, "ab"));
                arr.add(new Student(21, "ae"));*/
                arr.add("abc");
                arr.add(3);
                get(arr);
        }

        /**
         * 范形<T super XXX>测试方法
         * @param ArrayList
         *
         */
       
        public static  void get(ArrayList<? super SuperTest>  list)
        {
                Iterator<? super SuperTest> it = list.iterator();
                while(it.hasNext())
                {
                    System.out.println(it.next().toString());
                       
                }
               
        }
这样这个方法的限制就没有效果了,没有比较还好,如果有那不是出问题了,有点疑问拿出来大家分享一下呵呵
回复 使用道具 举报
沈样 黑马帝 2012-2-28 11:39:52
7#
张开开 发表于 2012-2-28 10:04
我是这么认为的。你说的Object是所有类的父类没有错。所以Object可以传进去。而不是XXX的父类的类肯定是不 ...

我觉得你说得有一点点问题,在java中所有类都是Object的,如果super就可以传所有的类了,我是这样理解的,XXX类的父类是Object,YYY是Object的子类,在定义成数据结构时,如果定义成Object,这样就什么参数都能传了,因为所以都Object的子类,都是Object类,只是刚看到范形视频,就把自己的疑问提问分享一下呵呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马