2010-11-18 81 views
-1

讓下面的代碼:如何根據其類型泛型調用方法?

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(); 
     } 
    } 

如何升級取決於他的類型的門票(AB),還是等等?

+1

你不喜歡金屬/木頭/汽車的比喻嗎? ;) – aioobe 2010-11-18 13:19:23

+0

不,這是有點差 – barroco 2010-11-18 14:14:25

+0

我看了被引用的另一個問題,並且aioobe是正確的。在這兩種情況下,你似乎都遺漏了一些繼承的概念。爲了進行更新,我只需要訪問「MySuperClass」對象。不管它是'A'還是'B',Java都會使用'update()'實現。 – unholysampler 2010-11-18 14:43:32

回答

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()是一個實例方法,因此您將需要一個實例來調用它。這可以用

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

實現由於polymorhism,它會調用從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()這將多態分派給update方法的實際對象的那t指。請注意,我添加了代碼來創建並存儲Class<T>的實例。

UPDATE - 我給Ticket構造函數添加了例外。這是您使用反射創建實例所支付的價格的一部分...而不是使用new創建它們並將它們作爲參數傳遞。

+0

我可以使用反射嗎? – barroco 2010-11-18 14:04:59

+0

你可以。事實上,我對你的例子做了調整,見'c.newInstance()'。但是沒有必要使用反射來調用't.update()'。 – 2010-11-18 22:38:16

相關問題