2012-03-14 5 views
2

저는 Java를 통해 OOP를 배우는 1 학년 학생입니다.
제네릭 형식을 이해하려고하는데 다음 예제에서는 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

답변

2

U은 모든 유형이 될 수 있기 때문에 전화를 사용할 수 있습니다.

U extends Animal을 만들면 Animal의 필드/메서드를 사용할 수 있습니다.

class DisguisedPerson<U extends Animal> 

당신은이 작업을 수행해야하거나

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

예! (내 감정은 23 개의 느낌표와 그 다음에 몇 가지를 덧붙여서 표현하면 더 정확하게 표현 될 것입니다.) 이 핵심을 분명히 해주셔서 고맙습니다. 이제 나는 임무를 수행 할 준비가되었습니다. 고맙습니다! – jollyroger

1

일반 클래스 DisguisedPerson<U>이 특정 제네릭 형식을 모르는 쓸 수 있고, 구체적으로는 AnimaldisguisedAs() 수익을 모르는, 그것은 반환 a U이지만이 U이 무엇인지 모르는 경우 Object 일 수 있으며 분명히 Object에는 species 필드가 없습니다.

실제 오브젝트 인 Animal은 런타임에만 "알려진"것이고 static typing은 java이므로 컴파일 할 때 실제 유형을 "알아야"합니다. a ObjectU extends .... [귀하의 경우 U extends Animal]을 지정하지 않는 한.

+0

저에게 완벽하게 명쾌하게 해주셔서 감사합니다. 내 문법의 모호성을 명확하게 지적하면 문제를 완전히 이해할 수 있으므로 도움이됩니다. – jollyroger

+0

@jollyroger : 당신이 가장 환영하고, 당신의 신념에 행운을 빕니다! – amit

관련 문제