本帖最后由 HM朱蛟 于 2013-4-5 18:29 编辑
以下是我的思路,希望得到指点让我理顺这个泛型限定中的疑问。问题比较少就2个,但是表述能力欠缺,所以写了一大堆,见谅了。
代码目录:
Code1 是对上限的应用 :<? extends Person> Code2 是对下限的应用 :<? extends Person> ,强转的情况下 Code3 是在指定了泛型的具体的类型后,便可以不用强转了 Code4 是比较器的例子
泛型的限定; ? extends E: 可以接收E类型或者E的子类型。上限。 ? super E: 可以接收E类型或者E的父类型。下限 思考: 1:从Code1根据”? extends E: 可以接收E类型或者E的子类型。上限。”,我知道了Student是Person的子类,而public static void print(ArrayList<? extends Person> al)是接收Person以及Person的子类。所以用print(al1);的时候是可以将Student传入的。限定上限没问题,符合老师总结的使用规则。 2:从Code2根据”? super E: 可以接收E类型或者E的父类型。下限”,我知道了Student是Person的子类,而public static void print(ArrayList<? super Student> al)是接收Student及其Student的父类,但是编译报错说找不到getName()方法,于是经过分析和提问后,得到的答案是“<? super Student> 并不是明确指定是哪一个类型,如果getName是子类特有的方法,你传了一个Person类的对象,那么Person就不能调用getName.所以定义泛型时,要明确指定是哪个类型。”
Q:第一个问题: 我Code定义成这个的public static void print(ArrayList<? extends Person> al),照理说 这样<? extends Person>也不算是 定义了具体的类型,那么为什么它不用强转就可以编译和运行了呢?
3:指明了明确的类型后,不用强转了,这里就相当于没有使用泛型限定这一说,但是同时我验证了一下将这2句改成:public static void print(ArrayList<Person> al)和Iterator<Person> it = al.iterator();就如视频里所说,ArrayList<Person> al = new ArrayList<Student>,泛型类引用是不会自动类型提升的,也就是说必须2边一样。若又想保持类型不一样,又想让程序运行起来,那么就必须使用通配符和泛型限定,泛型限定为了在使用通配符的时候更安全。
Q:第二个问题: Code4和 Code2/Code3 都是在使用<? super E>,下限应用,为何Code4可以不用强转也不用指明具体的子类类型,只需要指定父类类型就可以让程序运行? 我认为Code4的比较器例子才是真正意义上符合了泛型下限的使用规则,Code2和Code3要不就是强转,要不就是指明具体传入的那个类型。他们之间的区别究竟在何处呢? - CODE 1
- import java.util.*;
- class Demo
- {
- public static void main(String[] args)
- {
- ArrayList<Person> al = new ArrayList<Person>();
- al.add(new Person("NAME--01"));
- al.add(new Person("NAME--02"));
- al.add(new Person("NAME--03"));
-
- ArrayList<Student> al1 = new ArrayList<Student>();
- al1.add(new Student("NAME-stu--04"));
- al1.add(new Student("NAME-stu--05"));
- al1.add(new Student("NAME-stu--06"));
-
- print(al1);
- }
-
- public static void print(ArrayList<? extends Person> al)
- {
- Iterator<? extends Person> it = al.iterator();
- while(it.hasNext())
- {
- System.out.println(it.next().getName());
- }
- }
- }
- class Person
- {
- private String name;
- Person(String name)
- {
- this.name = name;
- }
-
- public String getName()
- {
- return name;
- }
- }
- class Student extends Person
- {
- Student (String name)
- {
- super(name);
- }
- }
复制代码- CODE 2:
- import java.util.*;
- class Demo
- {
- public static void main(String[] args)
- {
- ArrayList<Person> al = new ArrayList<Person>();
- al.add(new Person("NAME--01"));
- al.add(new Person("NAME--02"));
- al.add(new Person("NAME--03"));
-
- ArrayList<Student> al1 = new ArrayList<Student>();
- al1.add(new Student("NAME-stu--04"));
- al1.add(new Student("NAME-stu--05"));
- al1.add(new Student("NAME-stu--06"));
-
- print(al1);
- }
- public static void print(ArrayList<? super Student> al)
- {
- Iterator<? super Student> it = al.iterator();
- while(it.hasNext())
- {
- Person p = (Person)it.next();//必须强转
- System.out.println(p.getName());
- }
- }
- }
- class Person
- {
- private String name;
- Person(String name)
- {
- this.name = name;
- }
-
- public String getName()
- {
- return name;
- }
- }
- class Student extends Person
- {
- Student (String name)
- {
- super(name);
- }
- }
复制代码- CODE 3:
- import java.util.*;
- class Demo
- {
- public static void main(String[] args)
- {
- ArrayList<Person> al = new ArrayList<Person>();
- al.add(new Person("NAME--01"));
- al.add(new Person("NAME--02"));
- al.add(new Person("NAME--03"));
-
- ArrayList<Student> al1 = new ArrayList<Student>();
- al1.add(new Student("NAME-stu--04"));
- al1.add(new Student("NAME-stu--05"));
- al1.add(new Student("NAME-stu--06"));
-
- print(al1);
- }
-
- public static void print(ArrayList<Student> al)
- {
- Iterator<Student> it = al.iterator();
- while(it.hasNext())
- {
- System.out.println(it.next().getName());
- }
- }
- }
- class Person
- {
- private String name;
- Person(String name)
- {
- this.name = name;
- }
-
- public String getName()
- {
- return name;
- }
- }
- class Student extends Person
- {
- Student (String name)
- {
- super(name);
- }
- }
复制代码- CODE 4:
- import java.util.*;
- class GenericDemo7
- {
- public static void main(String[] args)
- {
- TreeSet<Student> ts = new TreeSet<Student>(new Comp());
- ts.add(new Student("abc03"));
- ts.add(new Student("abc02"));
- ts.add(new Student("abc06"));
- ts.add(new Student("abc01"));
-
- Iterator<Student> it = ts.iterator();
- while(it.hasNext())
- {
- System.out.println(it.next().getName());
- }
- //-------------------------------------------------------------------------------
- TreeSet<Worker> ts1 = new TreeSet<Worker>(new Comp());
- ts1.add(new Worker("wabc--03"));
- ts1.add(new Worker("wabc--02"));
- ts1.add(new Worker("wabc--06"));
- ts1.add(new Worker("wabc--01"));
- Iterator<Worker> it1 = ts1.iterator();
- while(it1.hasNext())
- {
- System.out.println(it1.next().getName());
- }
- }
- }
- class Comp implements Comparator<Person>
- {
- public int compare(Person p1,Person p2)
- {
- return p2.getName().compareTo(p1.getName());
- }
- }
- class Person
- {
- private String name;
- Person(String name)
- {
- this.name = name;
- }
- public String getName()
- {
- return name;
- }
- public String toString()
- {
- return "person :"+name;
- }
- }
- class Student extends Person
- {
- Student(String name)
- {
- super(name);
- }
- }
- class Worker extends Person
- {
- Worker(String name)
- {
- super(name);
- }
- }
复制代码 |