黑马程序员技术交流社区
标题:
有关泛型上限下限的问题
[打印本页]
作者:
lengmianluocha
时间:
2013-8-10 21:46
标题:
有关泛型上限下限的问题
今天毕老师关于泛型的视频,有个问题,阐述如下:
import java.util.*;
class Person {//定义一Person个类型
private String name;
Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class Student4 extends Person //Student4继承Person
{
Student4(String name) {
super(name);
}
}
public class GenernicDemo4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Student4> al = new ArrayList<Student4>();//新建一个Student4的ArrayList,并添加数据
al.add( new Student4("abc1"));
al.add(new Student4("abc2"));
ArrayList<Person> al1 = new ArrayList<Person>();//新建一个Person的ArrayList,并添加数据
al1.add( new Person("abc3"));
al1.add( new Person("abc4"));
printColl1(al1);//调用printColl1方法
printColl1(al);
}
<blockquote>public static void printColl1(ArrayList<? extends Person> al)//定义printColl1方法,用于打印传入ArrayList中的数据
复制代码
当我将printColl1中的参数换成“ArrayList<? super Student4> al”,时,此时的it.next()无法调用Person类中的getName()方法,代码如下:
public static void printColl1(ArrayList<? super Student4> al)//定义printColl1方法,用于打印传入ArrayList中的数据
{
Iterator<? super Student4> it = al.iterator();
while(it.hasNext())
{
System.out.println(it.next());<u><font color="#ff0000">//此出无法调用<span style="background-color: rgb(255, 255, 255);">Person类中的getName()方法</span></font></u>
}
}
复制代码
我的问题是,泛型的上限、下限,是不是有要求,比如此题中,写成
ArrayList<? super Student4> al就不可以调用
Person类中的getName()方法,而写成
ArrayList<? extends Person> al就可以呢?
作者:
郭利超
时间:
2013-8-10 22:46
ArrayList<? super Student4> student4 或者 student4父类型 所以 存进去应该类型提升至Object 所以你不能调用getname
ArrayList<? extends Person> 存进去 类型最高就是person 只能是person或者person的子类 所以可以调用getname
作者:
李江
时间:
2013-8-10 22:54
你这个应该是ArrayList<? extends Student4> al 不能正确运行,因为ArrayList 所持有的对象类型上限为Student4,但是他不知道具体持有的对象类型,编译错误 原因: 无法通过方法调用转换将实际参数ArrayList<Person>转换为ArrayList<? extends
Student4>
ArrayList<? super Student4> al 可以正确执行 //所持有对象为Student4 的超类,下限为Student4 ,知道具体持有的对象类型
作者:
神之梦
时间:
2013-8-11 00:30
我想这跟父类不能使用子类的特有方法相类似。
因为ArrayList<? super Student4> 接收的是Student4自己或其父类,同时其父类的父类也可以被接收。
而Person类默认的父类是Object,这样一个存储Object对象的集合,也可以使用printColl1这个方法,
这里说Object感觉变扭,我们就假设Person的父类是生物类,那么一个存有生物类对象的ArrayList集合也可以使用这个方法,但是这个生物类对象不一定有getName这个方法,
所以用it.next().getName()就不行了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2