黑马程序员技术交流社区
标题:
关于泛型限定的下限问题
[打印本页]
作者:
黄长利
时间:
2012-4-1 20:03
标题:
关于泛型限定的下限问题
import java.util.*;
class GenericLimit
{
public static void main(String[] args)
{
ArrayList<Person> al = new ArrayList<Person>();
al.add(new Person("asdh12"));
al.add(new Person("sdsds12"));
al.add(new Person("bsdgf12"));
al.add(new Person("dsfda12"));
printColl(al);
ArrayList<Student> al1 = new ArrayList<Student>();
al1.add(new Student("wushen"));
al1.add(new Student("juedui"));
al1.add(new Student("chixin"));
printColl(al1);
}
public static void printColl(ArrayList<? super Student> al) //此处限定泛型的下限 Student
{
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);
}
}
复制代码
以上代码在 printColl函数的参数位置,限定泛型的上限 使用 “? extends Person” 编译和运行没有问题,为什么使用下限方式就不能通过呢?
作者:
刘基军
时间:
2012-4-1 23:13
使用<? super Student>,即表示可以接受Student及其父类,
要是你传进去的是Object类,当执行System.out.println(it.next().getName());时,
就会出问题:Object根本没有getName()方法!
所以使用下限方式不行.
作者:
刘基军
时间:
2012-4-1 23:13
使用<? super Student>,即表示可以接受Student及其父类,
要是你传进去的是Object类,当执行System.out.println(it.next().getName());时,
就会出问题:Object根本没有getName()方法!
所以使用下限方式不行.
作者:
程旦
时间:
2012-4-1 23:15
Person 类有num属性是private的 子类Student无法继承的 所以子类student也就无法继承public String getName()这个方法,因为student没有num这个属性。。。。。然后你就通了吧。。。。
作者:
程旦
时间:
2012-4-2 00:01
刘基军 发表于 2012-4-1 23:13
使用
额 有理 我的那个错了。。。。
作者:
黄长利
时间:
2012-4-2 07:59
刘基军 发表于 2012-4-1 23:13
使用
就是说只要有传进去 Object 类的可能,就不能使用 getName() 方法了是吧
作者:
杨华威
时间:
2012-4-2 14:56
object也是Student的父类,但是Object没有getName()方法,所以不能编译通过。
直接写<Person>就行,传入Student 是没有问题的。前天我刚问过这个问题。
作者:
yangshang1
时间:
2012-4-2 19:48
package Test.com;
import java.util.*;
public class GenericLimit
{
public static void main(String[] args)
{
ArrayList<Person> al = new ArrayList<Person>();
al.add(new Person("asdh12"));
al.add(new Person("sdsds12"));
al.add(new Person("bsdgf12"));
al.add(new Person("dsfda12"));
printColl(al);
ArrayList<Student> al1 = new ArrayList<Student>();
al1.add(new Student("wushen"));
al1.add(new Student("juedui"));
al1.add(new Student("chixin"));
printColl(al1);
}
public static void printColl(ArrayList<? super Student> al) //此处限定泛型的下限 Student
{
Iterator<? super Student> it = al.iterator();
while(it.hasNext())
{
Person s=(Person)it.next();
System.out.println(s.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);
}
}
这样就可以了
作者:
孙利川
时间:
2012-4-2 20:51
<? super Student>意思是说可以接收Student类型或Student的父类型,那么如果不能保证Student及其父类中都有getName()方法,就不能使用该方法。
那么<? super Student>可以改成<? extends Person>,这个意思是可以接收Person及其子类,因为Person类中有getName()方法,所以其子类中也自然都有getName()方法。
作者:
袁计艳
时间:
2012-4-2 22:03
Person 类是private的 子类Student无法继承的 所以子类student也就无法继承getName()这个方法,因为student不能用getName()这个方法,如把Person 类权限为public,则可以通过。
另一种是<? super Student>可以改成<? extends Person>,也可以通过。
还有一种是在迭代里把it.next强制转换成person
while(it.hasNext())
{
Person s=(Person)it.next();
System.out.println(s.getName());
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2