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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 闪耀.Q 中级黑马   /  2014-6-12 17:28  /  1391 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在泛型里。<? extends E>有上限,好理解。<? super E>有下限问题,不太明白。Object类是所有类的父类,要考虑Object类么?比如Student类继承Person类。下面的代码:Student类是下限,它继承父类Person。Person类里有个方法getName(),是Object类里没有的。那怎么办?
Iterator<? super Student> it = al.iterator();
while(it.hasNext())
{
       System.out.println(it.next().getName());
}

8 个回复

倒序浏览
如果还写object的话,泛型的出现就没有作用了,你既然明确了是students,为什么还要写object,如果写了object,那么你就需要强转,把Object向下转型,转成你要操作的类型,那么这样图什么了,以前没有泛型,所以我们不能定义我们操作的类型,所以用Object来表示,现在直接能定义,你如果不知道操作什么类型你可以写一个<T>,但是你总不能说我在明确了student和person的情况下,最后里面写个Object,最后还得强转。
回复 使用道具 举报
相濡、彼岸 发表于 2014-6-12 19:17
如果还写object的话,泛型的出现就没有作用了,你既然明确了是students,为什么还要写object,如果写了object ...


泛型的下限不是说:<? super E>意思是E的父类。
Iterator<? super Student> it = al.iterator(); 迭代Student的父类,我的问题是这个父类,包不包括object类。
新手虚心求教!
回复 使用道具 举报
闪耀.Q 发表于 2014-6-12 19:37
泛型的下限不是说:

包括了,
回复 使用道具 举报

import java.util.*;
class Person
{
        private String name;
        Person(String name)
        {
        this.name = name;
        }
        public String getName()
        {
        return name;
        }
}
class Student extends Person
{
         private String name;
         Student(String name)
         {
        super(name);
          }
}
class GenericTest
{
         public static void main(String[] args)
         {
        ArrayList<Person> al = new ArrayList<Person>();
        al.add(new Person("sun01"));
        al.add(new Person("sun02"));
        al.add(new Person("sun03"));
        sop(al);

        ArrayList<Student> al1 = new ArrayList<Student>();
        al1.add(new Student("sss01"));
        al1.add(new Student("sss02"));
        al1.add(new Student("sss03"));
        sop(al1);
               
           }
          public static void sop(ArrayList<? super Student> al)
          {
        Iterator<? super Student> it = al.iterator();
        while(it.hasNext())
        {
               System.out.println(it.next().getName());
        }
        }
}
编译一直不通过。<? super Student>改成<? extends Person>就成功了.这是咋回事呢?
回复 使用道具 举报
好好学习,以后肯定会知道
回复 使用道具 举报
闪耀.Q 发表于 2014-6-12 21:19
import java.util.*;
class Person
{

回复 使用道具 举报
闪耀.Q 发表于 2014-6-12 21:19
import java.util.*;
class Person
{

import java.util.*;
class Person
{
         private String name;
         Person(String name)
         {
         this.name = name;
         }
         public String getName()
         {
         return name;
         }
}
class Student extends Person
{
         // private String name;  这里父类已经定义了,不用再写了。
          Student(String name)
          {
              super(name);
          }
}

class GenericTest
{
          public static void main(String[] args)
         {
         ArrayList<Person> al = new ArrayList<Person>();
         al.add(new Person("sun01"));
         al.add(new Person("sun02"));
         al.add(new Person("sun03"));
         sop(al);

        ArrayList<Student> al1 = new ArrayList<Student>();
         al1.add(new Student("sss01"));
         al1.add(new Student("sss02"));
         al1.add(new Student("sss03"));
         sop(al1);
                 
           }

           /* public static void sop(ArrayList<?  super Student> al) //这里最好用的是上限而不是下限,
           {                                                                                       //因为你这里可以传Student和
                                                                                                 //Student的父类型,也就包括了
               Iterator<?  super Student > it = al.iterator();      //Object,  Object里面没有getName()方法,
                                                                                          //所以就会报错,
            while(it.hasNext())   
            {
                System.out.println(it.next().getName());
            }
          }*/

           public static void sop(ArrayList<? extends Person > al)//用上限,可以传Person和Person的子类型
       {                                                       //这样就不会报错了。
                                                        
      Iterator<? extends Person > it = al.iterator();

       while(it.hasNext())   
            {
                System.out.println(it.next().getName());
            }

          }
}

回复 使用道具 举报
相濡、彼岸 发表于 2014-6-13 13:05
import java.util.*;
class Person
{

谢了哥们~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马