黑马程序员技术交流社区
标题:
关于java泛型上限与下限的疑惑,麻烦懂得进来看看
[打印本页]
作者:
macover
时间:
2015-3-3 14:53
标题:
关于java泛型上限与下限的疑惑,麻烦懂得进来看看
下面代码如何改成下限方法,我尝试修改了,编译出错。求解答
import java.util.*;
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);
}
}
class TreeSetDemo9
{
public static void main(String[] args)
{
ArrayList<Person> al = new ArrayList<Person>();
al.add(new Person("java01"));
al.add(new Person("java02"));
al.add(new Person("java03"));
printColl(al);
System.out.println();
ArrayList<Student> al1 = new ArrayList<Student>();
al1.add(new Student("abc01"));
al1.add(new Student("abc02"));
al1.add(new Student("abc03"));
printColl(al1);
}
public static void printColl(ArrayList<? extends Person> al)
{
Iterator<? extends Person> it = al.iterator();
while(it.hasNext())
{
System.out.println(it.next().getName());
}
}
}
复制代码
作者:
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