2010-11-18 7 views
-1

다음 코드를 보자유형에 따라 메서드를 호출하는 방법 generic?

public abstract class MySuperClass { 
     public abstract void update(); 
     /* ... */ 
    } 

    public class A extends MySuperClass { 
     @Override 
     public void update() { /* ... */ } 
     /* ... */ 
    } 

    public class B extends MySuperClass { 
     @Override 
     public void update() { /* ... */ } 
     /* ... */ 
    } 

    public class Ticket<T extends MySuperClass> { 
     private Class<T> c; 
     public Ticket(Class<T> c){ this.c = c; } 
     public Class<T> getClass() { return this.c; } 
     public void update() { /* HOW TO DO! */ } 
     /* ... */ 
    } 

    public class Main { 
     public static void main(String[] args) { 
     Ticket<A> myTicket1 = new Ticket<A>(A.class); 
     Ticket<B> myTicket2 = new Ticket<B>(B.class); 
     myTicket1.update(); 
     myTicket2.update(); 
     } 
    } 

어떻게 등등 자신의 유형에 따라 티켓 (A, B), 또는 업그레이드합니까?

+1

금속/목재/자동차 유추를 더 이상 좋아하지 않았습니까? ;) – aioobe

+0

아니, 조금 달라. – barroco

+0

나는 참조 된 다른 질문을 보았고 aioobe가 옳았다. 두 경우 모두 상속의 개념 중 일부가 누락 된 것으로 보입니다. 업데이트를하기 위해서 필요한 것은'MySuperClass' 객체에 접근하는 것입니다. 그것이'A' 또는'B'인지 상관없이, Java는'update()'구현을 사용할 것입니다. – unholysampler

답변

4

Ticket은 실제로 어떤 업데이트가 무엇인지에 대해 알고 있습니다. 전화를 MySuperClass의 인스턴스로 전달하면됩니다. 제네릭 클래스의 요점은 제네릭 클래스가 어떤 종류인지 정확히 알 필요없이 모든 객체 (또는 객체의 하위 집합)에서 작동한다는 것입니다.

public class Ticket<T extends MySuperClass> { 
    private T thing; 
    public Ticket(T thing) { 
    this.thing = thing; 
    } 
    public void update() { 
    thing.update(); 
    } 
    /* ... */ 
} 
0

update()는 인스턴스 메서드이므로 인스턴스를 호출해야합니다. 이것은 인해 polymorhism에

getClass().newInstance().update(); 

달성 할 수있다, 그것은 더 객체 지향적 인 방법으로 그것을 해결하기 위해하지만, A 또는 B 에서 올바른 메소드를 호출, 당신은 티켓 생성자로 인스턴스를 전달 그냥한다 update()를 호출하십시오.

0

나는 더 이해하기 쉽도록 예제를 수정했습니다 ... update을 구현했습니다.

public class Ticket<T extends MySuperClass> { 
    private Class<T> c; 
    private T t; 

    public Ticket(Class<T> c) throws InstantiationException, IllegalAccessException { 
     this.c = c; 
     this.t = c.newInstance(); 
    } 

    public Class<T> getClass() { 
     return this.c; 
    } 

    public void update() { 
     t.update(); 
    } 
    /* ... */ 
} 

update있어서 다형 t가 참조하는 실제 객체의 update 방법에 파견 t.update() 부른다. Class<T>의 인스턴스를 만들고 저장하는 코드를 추가했습니다.

업데이트 - Ticket 생성자에 예외를 추가했습니다. 이는 인스턴스 생성을 위해 리플렉션을 사용하는 데 드는 대가의 일부입니다. new을 사용하여 리플렉션을 작성한 다음 인수로 전달하는 것이 아닙니다.

+0

리플렉션을 사용할 수 있습니까? – barroco

+0

수 있습니다. 실제로, 당신의 예제에 대한 나의 비틀기는; 'c.newInstance()'를 참조하십시오. 그러나 리플렉션을 사용하여't.update()'를 호출 할 필요는 없습니다. –

관련 문제