2017-02-13 156 views
2

我正在實現一個接口 - Codec,它是泛型類型的。泛型類的返回類

它有一個方法,像這樣的,我需要實現

Class<T> getEncoderClass() 

現在,如果實現是簡單的類這樣的,使用起來非常方便 -

public ACodec implements Codec<A>{ 

    public Class<A> getEncoderClass(){ 
     return A.class; 
    } 

} 

但在一般的情況下,實現我很困惑如何編寫例如 -

public class A<B>{ 
} 

public ACodec implements Codec<A>{ 

    public Class<A<B>> getEncoderClass(){ 
     //How to implement this ? 
    } 

} 
+0

'ACodec'也應該用一個類型參數定義。看到我的答案。 – CKing

回答

-2

在Java通用信息是編譯代碼(類型擦除)後丟失,所以每個泛型類也是非泛型類。

因此,第一個示例中的代碼也應該可以正常工作。

1

您需要更改您定義ACodec類的方式如下:

class ACodec<T> implements Codec<A<T>>{ 

    public Class<A<T>> getEncoderClass(){ 
     //How to implement this ? 
    } 

} 

這裏,類型參數TACodec類和BA類應與同一類型取代我相信這就是你想要達到的目標。例如:

ACodec<String> aCodecStr = new ACodec<String>(); 
Class<A<String>> codecStr = aCodecStr.getEncoderClass();//works 
Class<A<Integer>> codecInteger = aCodecStr.getEncoderClass();//doesn't work 

這就是說,它是幾乎不可能通過A<T>getEncoderClass因爲泛型經過在編譯時間本身類型擦除,以獲得Class表示。