黑马程序员技术交流社区
标题:
求教:泛型限定中<? super E>不能继承父类方法么?
[打印本页]
作者:
zz_job
时间:
2014-8-7 16:56
标题:
求教:泛型限定中<? super E>不能继承父类方法么?
问题出现在毕老师JAVA基础视频第15天-12-集合框架(泛型限定)中
代码如下:
import java.util.*;
class GenericAsk
{
public static void main(String[] args)
{
ArrayList<Person> al = new ArrayList<Person>();
al.add(new Person("person01"));
al.add(new Person("person02"));
al.add(new Person("person04"));
printColl(al);
ArrayList<Student> al1 = new ArrayList<Student>();
al1.add(new Student("stu--01"));
al1.add(new Student("stu--03"));
al1.add(new Student("stu--05"));
printColl(al1);
//相当于ArrayList<Student> al = new ArrayList<Person>(); 会报错
//这个表达式两边的数据类型必须相同!
}
/*
public static void printColl(ArrayList<? extends Person> al)
{
Iterator<? extends Person> it = al.iterator();
while(it.hasNext())
{
System.out.println(it.next().getName());
}
}
*/
public static void printColl(ArrayList<? super Student> al)
{
Iterator<? super 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);
}
}
复制代码
如果是用<? extends Person>就可以编译通过。
如果用<? super Student>就不能编译通过。报如下错误:
---------- 编译java程序 ----------
GenericAsk.java:37: 错误: 找不到符号
System.out.println(it.next().getName());
^
符号: 方法 getName()
位置: 类 Object
1 个错误
输出完成 (耗时 1 秒) - 正常终止
想问的是,子类不是可以直接继承父类的方法么?为什么这里就找不到getName()方法呢?
作者:
790324255a
时间:
2014-8-7 17:12
<? super E>下边界 指定类型是某个类型或其祖先类型 获取的对象是Object object没有getName()方法 编译时当然会报错
作者:
zz_job
时间:
2014-8-7 17:22
790324255a 发表于 2014-8-7 17:12
大神你好!
可是如果是这样的话,<? super E>这种写法到底应该怎么应用呢? 因为只要这样一写,最终都会指向Object类了啊?
作者:
kakasa
时间:
2014-8-7 17:39
应该这么写吧,
ArrayList<Person> al = new ArrayList<Person>();
al1.add(new Student("stu--01"));
al1.add(new Student("stu--03"));
al1.add(new Student("stu--05"));
作者:
zz_job
时间:
2014-8-7 17:56
刚刚试了一下,<? super Student>这种写法确实指到Object类中去了。Object类中当然没有getName()方法了。
所以我想说的是,难道这种用法注定是只能调用Object类中的方法么?现在只能这么理解他的用法了。
如果说得不对。欢迎大神们踊跃跳出来打脸啊!!!
谢谢kakasa、790324255a回复啦~
作者:
790324255a
时间:
2014-8-7 21:08
zz_job 发表于 2014-8-7 17:22
大神你好!
可是如果是这样的话,
别这样称呼 我受不起:L 如果你想调用方法的话就选< ? extends E> 如果你想往集合中添加元素的话就用<? super E> 适合往一个集合中添加一个具有继承性质的对象 用于添加元素 可以限定添加的元素为E的子类 比如 通常我们定义一个集合 如果使用泛型 List<String> list=new ArrayList<String>();这时我们只能添加一种类型 而如果我们采用 List<? super E> list=new ArrayList(); 这时我们可以往集合中添加E的对象或E的子类 不止添加一种类型
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2