黑马程序员技术交流社区

标题: 泛型限定问题!【已解决】 [打印本页]

作者: 马林贺    时间: 2012-6-12 11:26
标题: 泛型限定问题!【已解决】
本帖最后由 马林贺 于 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)
作者: 郑传庆    时间: 2012-6-12 11:56
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类范围内都可以。
作者: 王广丛    时间: 2012-6-12 12:07
  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.     }
复制代码
另外希望加技术分,正在急需技术分,参加报名考试
作者: 黄奕豪    时间: 2012-6-12 12:13
因为这是Iterator定义时候的问题,API上是这样写的:Iterator<E> iterator()返回按适当顺序在列表的元素上进行迭代的迭代器。 也就是说你调用哪个List或者Set的iterator方法来获得迭代器,它返回的参数化类型必须与调用者的泛型上的一样。因为在编译的过程中程序并没有执行,它不知道你到底是不是子父类的关系,它只看到你那个泛型定义的地方是不是位数相等,是不是字母一样,他根本不理会你到底是不是它的父亲,这就是Java泛型的短板,如果是C#你这样定义是没错的。我这里查的是List的iterator,打头的List定义为List<E>,所以调用返回的是Iterator<E>,两个的泛型参数必须一样~
作者: 马林贺    时间: 2012-6-12 15:00
王广丛 发表于 2012-6-12 12:07
另外希望加技术分,正在急需技术分,参加报名考试

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

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

嗯,可以接收Prerson以及它的子类,它跟List<? super Prerson> 相反的,自己找些资料,网上应该有介绍




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