黑马程序员技术交流社区

标题: 关于java泛型上限与下限的疑惑,麻烦懂得进来看看 [打印本页]

作者: macover    时间: 2015-3-3 14:53
标题: 关于java泛型上限与下限的疑惑,麻烦懂得进来看看


下面代码如何改成下限方法,我尝试修改了,编译出错。求解答



  1. import java.util.*;

  2. class Person
  3. {
  4.         private String name;

  5.         Person(String name)
  6.         {
  7.                 this.name = name;
  8.         }

  9.         public String getName()
  10.         {
  11.                 return name;
  12.         }
  13. }

  14. class Student extends Person
  15. {
  16.         Student(String name)
  17.         {
  18.                 super(name);
  19.         }
  20. }
  21. class TreeSetDemo9
  22. {
  23.         public static void main(String[] args)
  24.         {
  25.                 ArrayList<Person> al = new ArrayList<Person>();

  26.                 al.add(new Person("java01"));
  27.                 al.add(new Person("java02"));
  28.                 al.add(new Person("java03"));

  29.                 printColl(al);

  30.                 System.out.println();

  31.                 ArrayList<Student> al1 = new ArrayList<Student>();

  32.                 al1.add(new Student("abc01"));
  33.                 al1.add(new Student("abc02"));
  34.                 al1.add(new Student("abc03"));

  35.                 printColl(al1);
  36.         }

  37.         public static void printColl(ArrayList<? extends Person> al)
  38.         {
  39.                 Iterator<? extends Person> it = al.iterator();

  40.                 while(it.hasNext())
  41.                 {
  42.                         System.out.println(it.next().getName());
  43.                 }
  44.         }
  45. }
复制代码





作者: macover    时间: 2015-3-3 15:12
不能重新编辑帖子,回复自己下。
1,刚研究出,代码稍作修改,覆盖toString,可打印结果。
2,为什么我调用getName(),却得不出结果??
作者: 田得聖老师    时间: 2015-3-3 15:47
泛型限定
一般向集合添加元素的时候,既能添加本类对象,又能添加子类对象,这时候用上限
从集合中取出元素的时候,既能当成本类对象接受,又能当父类型接受,这时候用下限

这样想象一下,
如果迭代器定义的泛型上限,比如有一个子类,复写了父类的getName()方法,那么迭代器怎么分辨取出的元素种类对应的方法呢?
所以传输的类型默认就是Object,Object没有getName(),只有toString()
作者: macover    时间: 2015-3-3 16:14
tds13821562936 发表于 2015-3-3 15:47
泛型限定
一般向集合添加元素的时候,既能添加本类对象,又能添加子类对象,这时候用上限
从集合中取出元素 ...

谢谢你。你回答的很详细,我明白了
作者: sofeel    时间: 2015-3-3 18:20
藤椅 兄弟说的很好。
System.out.println(it.next().getName());这句没打出结果,显然是没有识别到it.next()就是student,
这是因为泛型没起作用。泛型为什么没起作用?那么,可以追问:一个类只有一个子类吗?不是,那泛型当然不会起作用。

总结:
泛型的限定是用在设计类的时候,
而应用时应该明确化。
作者: 夏季熬成了秋    时间: 2015-3-3 22:05
长知识了~6666,




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