从Java中的泛型类型访问对象变量



我是通过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]。

最新更新