2016-12-15 171 views
2

從C++遷移到Java。Java通用接口返回類型

我有一個第三方代碼與我需要實現的界面是這樣的。

public interface Foo<T>{ 
     public T doSomething(); 
} 

欲實現此接口,這樣我可以調用doSomething的(),並獲得3級不同的類A, B and C延伸,如下一個共同的基Z

public class A extends Z{...}; 
public class B extends Z{...}; 
public class C extends Z{...}; 

我找不到任何避免編寫以下3類的方法。

public class ARet implements Foo<A>{...} 
public class BRet implements Foo<B>{...} 
public class CRet implements Foo<C>{...} 

對於給定的接口Foo,是不是可以寫返回T extends Z一些東西,看起來像public class Ret implements Foo<T extends Z>{...}的實現。這似乎不起作用。有沒有什麼辦法可以避免這三個班級,或者沒有辦法繞過它?

回答

6

如果你想在接口的實現是通用的,你需要聲明T作爲懲戒的泛型類型參數:

public class Ret<T extends Z> implements Foo<T>{...} 
+0

注意函數簽名'T DoSomething的'在接口()。它將返回一個'T'類型而不需要將'T'對象作爲參數之一。這意味着要返回的對象'T'必須在'doSomething()'函數中創建。雖然我是Java新手,但我的理解是,由於類型擦除,這是不可能的。還是我誤解了這些概念? – cplusplusrat

+1

@cplusplusrat它也可以意味着實現類有一個'set(T對象)'或者其他一些將'T'實例傳遞給實現類實例的方法,並且你的'something()'方法返回那個實例。這與'java.util.List '接口類似,其'get(int i)'方法返回一個'T'實例。 ''T''實例不能在'doSomething()'方法中創建,除非你傳遞一個'Class '參數給它。 – Eran

+0

好的,所以爲了您的解決方案的工作,沒有逃脫setter方法,以便'doSomething()'有對象工作並返回。那是我的想法,但需要第二個意見。謝謝。我會將此標記爲已解決。 – cplusplusrat