我是通过Java学习面向对象程序的一年级学生
我正在努力理解泛型类型,在下面的例子中,我的印象是,defuisedAs()返回指向对象实例的指针。事实并非如此
为什么我的代码不能工作?我如何才能编译和运行它
提前感谢!
public class GenericTest {
public static void main(String[] args) {
Animal tux = new Penguin();
DisguisedPerson<Animal> dave = new DisguisedPerson<Animal>(tux, "Dave");
dave.disguisedAs().call();
dave.reveal();
}
}
interface Disguised <T> {
T disguisedAs();
}
class Person {
String name;
Person(String name) {
this.name = name;
}
}
class DisguisedPerson<U> extends Person implements Disguised<U> {
U resembles;
DisguisedPerson(U costume, String name) {
super(name);
resembles = costume;
}
public U disguisedAs() {
return resembles;
}
void reveal() {
System.out.println(name + " was dressed up as a " + disguisedAs().species); // returns error: cannot find symbol!
}
}
abstract class Animal {
String species;
String call;
Animal(String c) {
species = this.getClass().getName();
this.call = c;
}
void call() {
System.out.println(this.call + "! ImA " + this.species);
}
}
class Penguin extends Animal {
Penguin() {
super("Pip");
}
}
您的调用确实有效,因为U
可以是任何类型。
如果您使U扩展Animal,那么您可以使用Animal的字段/方法。
class DisguisedPerson<U extends Animal>
你必须这样做,否则你可以写
DisguisedPerson<Integer> dave = new DisguisedPerson<Integer>(1, "One");
泛型类DisguisedPerson<U>
不知道具体的泛型类型,具体来说,它不知道disguisedAs()
返回Animal
,它返回U
,但你不知道这个U
是什么,它可能是Object
,显然Object
没有字段species
。
请记住,实际的对象,在您的情况下确实是Animal
,只有在运行时才是"已知的",并且由于java有静态类型,它需要在编译时"知道"实际类型,所以它假设是Object
,除非您指定U extends ....
[在您的案例中是U extends Animal
]。