2017-09-14 213 views
2

讓我先說明我的情況:JAVA:泛型類繼承和泛型類型繼承

我已經在第三方SDK,與通用型基類:

public abstract class BaseClass<T extends BaseDataType> { 
    public abstract class BaseDataType {xxx} 
    public abstract int getCount(); 
    public abstract someMethod(T t); 
} 

在我商業環境,它延伸BaseClass如下:

​​ 在真正的商業

,我寫我的課:

public class MyClass extends MyGeneralBaseClass<MyDataType> { 
    @Override public someMethod(MyDataType type) {xxx} 
} 

public class MyDataType extends BaseClass.BaseDataType { 
    xxx 
} 

但代碼無法編譯。對不起,我旅行,我沒有我的IDE和開發工具,所以我不能粘貼錯誤。但我認爲如果你在一個IDE這樣的IntelliJ Idea中寫下來,它會給我遇到的錯誤。

那麼如何編寫這種情況:繼承泛型類型,並繼承使用泛型類的類。

我想要的是,MyClass使用具體類MyDataType而不是摘要BaseDataType

回答

2

看來MyGeneralBaseClas應該有一個泛型類型參數與同類型綁定爲BaseClass

public abstract class MyGeneralBaseClas<T extends BaseDataType> extends BaseClass<T> { 
    @Override public int getCount() {return some_list.size()}; 
    @Override public abstract someMethod(T t); 
} 
+0

這正是我想要的。你會請我幫忙詳細解釋一下嗎?或者提供一些易於理解的文章網址。很多thx –

+0

@McArthorLee基於'class MyClass extends MyGeneralBaseClass '我想你'MyGeneralBaseClas'有一個擴展'BaseDataType'的泛型類型參數。因此'MyGeneralBaseClas '。現在,由於'BaseClass'還需要一個擴展'BaseDataType'的類型參數,因此可以將'T'傳遞給它,從而爲您提供'class MyGeneralBaseClas extends BaseClass ' – Eran

+0

yes,you are right。但你的解釋是關於我的商業環境。你可以給一些通用的JAVA解釋。 thx –

0

你可以做到這一點有兩種方式:

  1. 通過使用BaseDataType類按原樣例如:

    abstract class MyGeneralBaseClas<T extends BaseDataType> extends BaseClass<T> { 
        @Override public void someMethod(T t){} 
    } 
    
  2. 通過擴展BaseDataType類,例如:

    class DerivedDataType extends BaseDataType{ 
        //Some code 
    } 
    
    abstract class MyAnotherBAseClass<DerivedDataType> extends BaseClass{ 
        @Override 
        public void someMethod(com.gamesys.application.BaseDataType t) {} 
    } 
    
+0

當我擴展'BaseDataType',這意味着我在商業環境,所以我必須定義一個具體的類而不是抽象的。 –

+0

我已經得到了答案。無論如何。 –