2012-07-17 126 views
0

我的階級結構是這樣的:Java的泛型類型的推斷

class A1,A2,..,An extends A; 
class B1,B2,..,Bn extends B; 

而且類轉換成AiBi

private B1 convert(A1 a1){} 
... 
    private Bn convert(An an){} 

我如何定義與像<? extends B> convert(<? extends A> a)簽名單一的公共方法? 現在我只有這種方法:

B convert(A a){ 
     if(A.getClass().equals(A1.class)){ 
     return convert((A1)a); 
     }... 
    } 

我能使用的instanceof如果性能比較是重要的,該方法將被頻繁調用?

+3

只是一個想法:IMHO更優雅的解決方案將是在'A'中聲明一個方法[最好是抽象的,如果'A'是抽象的]:'public B toB()',這將從調用者創建一個'B'實例。 – amit 2012-07-17 09:21:01

+0

就這麼簡單!謝謝!爲什麼我沒有想到它? – 2012-07-17 09:36:13

+0

由於它似乎可以幫助您,因此我將其添加爲代碼捕捉的答案。很高興我能幫上忙。 – amit 2012-07-17 09:42:01

回答

2

更優雅解決方案可能會在A中聲明一種方法:[最好是abstract,如果Aabstract]:

public abstract B toB(); 

重寫類(A1,A2,...)將要覆蓋它並實例自己B對象。

代碼卡扣[自我實現它作爲一個內部類的static改性劑使用時,它是不需要的,並且如果類是外類不能被用於]:

public abstract static class A { 
    public abstract B toB(); 
} 
public static class A1 extends A { 
    @Override 
    public B1 toB() { 
     return new B1(); 
    } 

} 

public static class B { 

} 
public static class B1 extends B { 

} 
0

,你可以這樣做:

public <AType extends A, BType extends B> BType convert(AType a) {... 

但是就像你可以有轉換器接口:

public interface Converter<AType extends A, BType extends B> { 

    AType convert(BType b); 

    BType convert(AType a); 

} 

關於性能的問題,你可以看看here

+0

謝謝你,弗朗西斯科! – 2012-07-17 09:35:00