2012-03-14 71 views
2

我是第一年通过Java学习OOP的学生。
我想了解泛型类型,在下面的示例中,我感觉disguisedAs()返回指向对象实例的指针。不是这种情况。
为什么我的代码不工作,我怎样才能让它编译和运行?
在此先感谢!从Java中的泛型类型访问对象变量

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"); 
    } 
} 
+0

对于具有真实代码的真实特定问题+1,你已经尝试了一些东西。太多的用户最近都在尝试“给我代码”的问题:\ – amit 2012-03-14 17:19:14

回答

2

您的电话确实有效,因为U可以是任何类型。

如果你让U伸展动物,那么你可以使用动物的领域/方法。

class DisguisedPerson<U extends Animal> 

你必须这样做,或者你可以写

DisguisedPerson<Integer> dave = new DisguisedPerson<Integer>(1, "One"); 
+0

是的! (如果我用23个惊叹号跟着那个,我会更精确地表达我的感受) 非常感谢你让我明白这个关键点!现在我准备好完成我的任务。谢谢! – jollyroger 2012-03-14 16:59:14

1

泛型类DisguisedPerson<U>不知道具体的泛型类型,具体而言,它并不知道disguisedAs()返回一个Animal,它返回一个U,但你不知道这个U是什么,它可能是一个Object,显然Object没有一个字段species

请记住,实际上你的实际对象Animal仅在运行时“已知”,并且由于java有static typing,它需要在编译时“知道”实际类型,所以它假定一个Object,除非你指定U extends .... [你的情况U extends Animal]。

+0

谢谢你让我完全清楚。明确指出我的语法含糊不清是有帮助的,所以我对问题有了充分的理解。 – jollyroger 2012-03-14 17:14:07

+0

@jollyroger:你很受欢迎,祝你好运! – amit 2012-03-14 17:17:45