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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马林贺 中级黑马   /  2012-6-12 11:26  /  2273 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 马林贺 于 2012-6-12 15:19 编辑

[code]public static void iteratorToou(List< ? extends Prerson > arr)      //  为什么我这里写泛型限制会出问题
        {
                                            Iterator<;Prerson> it = arr.iterator();
                                            while (it.hasNext()) ;
                                  Prerson p = it.next();
                                                           System.out.println(p.getName() + "......" + p.getAge();
         }
        }
}
     1.(List< ? extends Prerson > arr)   我在这里写泛型限定,为什么会报错,

      类型不匹配:不能从 Iterator<capture# 1- of  ? extends Prerson> 转换为 Iterator<;Prerson>

    2.求高人解释一下  这个泛型限定  看视频没有看懂~

   public static <T extends Comparable<? super T>> void sort(List<T> list)

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
List< ? extends Prerson > :表示继承自Prerson 类,List持有的对象是Prerson 类,上限是Prerson 类。   只要是继承进行赋值都要按照List< ? extends Prerson >这种方式。   
public static void iteratorToou(List<? extends Prerson> arr)  
        {
                Iterator<? extends Prerson> it = arr.iterator();//这样写,赋值时就不会出错

                while (it.hasNext())
                        ;

                Prerson p = it.next();

                System.out.println(p.getName() + "......" + p.getAge());

        }

这里所说的上限我给你举个举个例子:有A类和B类 ,他们都继承Prerson 类;这时 List<? extends Prerson> 就可以写成List<? extends A> 或List<? extends B>。也就是说,在不超过Prerson类范围内都可以。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1.         public static void iteratorToou(List< ? extends Prerson > arr)      // 这里是没有错误的
  2.     {
  3.                 Iterator<Prerson> it = (Prerson)arr.iterator();//错误在这里,因为 ? extends Prerson表示Prerson的子类,所以需要强制转换
  4.         while (it.hasNext()){        //另外楼主的while循环也有从无,正确的应该这样写
  5.                 Prerson p = it.next();
  6.                 System.out.println(p.getName() + "......" + p.getAge();
  7.         }
  8.      }
  9.     }
复制代码
另外希望加技术分,正在急需技术分,参加报名考试

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 积极发现和解决问题,技术分不是问题.

查看全部评分

回复 使用道具 举报
因为这是Iterator定义时候的问题,API上是这样写的:Iterator<E> iterator()返回按适当顺序在列表的元素上进行迭代的迭代器。 也就是说你调用哪个List或者Set的iterator方法来获得迭代器,它返回的参数化类型必须与调用者的泛型上的一样。因为在编译的过程中程序并没有执行,它不知道你到底是不是子父类的关系,它只看到你那个泛型定义的地方是不是位数相等,是不是字母一样,他根本不理会你到底是不是它的父亲,这就是Java泛型的短板,如果是C#你这样定义是没错的。我这里查的是List的iterator,打头的List定义为List<E>,所以调用返回的是Iterator<E>,两个的泛型参数必须一样~
回复 使用道具 举报
王广丛 发表于 2012-6-12 12:07
另外希望加技术分,正在急需技术分,参加报名考试

  知道,while循环后面加分号了吧,那是我粘贴代码的时候,不小心给弄上去的吧。
回复 使用道具 举报
郑传庆 发表于 2012-6-12 11:56
List< ? extends Prerson > :表示继承自Prerson 类,List持有的对象是Prerson 类,上限是Prerson 类。   只 ...

  我这里做的是上限吧,我可以接收 Prerson 类,还有Prerson类对吧,我报错的地方就是 我在迭代的时候,必须写成 和我上面的参数一样对吧。
回复 使用道具 举报
本帖最后由 郑传庆 于 2012-6-12 15:16 编辑
马林贺 发表于 2012-6-12 15:05
我这里做的是上限吧,我可以接收 Prerson 类,还有Prerson类对吧,我报错的地方就是 我在迭代的时候, ...

嗯,可以接收Prerson以及它的子类,它跟List<? super Prerson> 相反的,自己找些资料,网上应该有介绍
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马