0

我遇到了實現抽象類的問題。我使用List作爲AbstractClass中的參數聲明瞭抽象方法,但是當我實現它時,它給了我編譯錯誤,說我沒有正確實現抽象cass im擴展。Java抽象方法參數類型

public abstract class MyAbstractClass<T> { 
    abstract protected List<T> MyMethod(List<String> list); 
} 

public class MyClass<MyObject> extends MyAbstractClass { 
    @Override 
    protected List<MyObject> MyMethod(List<String> list){ 
     //Do Stuff 
    } 
} 

每當我實現它自動將它使List<String>只是List。 這有什麼理由嗎?謝謝。

+2

請說明你是如何「執行」它。我猜你正在使用原始類型。 –

+1

你可能想要公共類MyClass extends MyAbstractClass { –

回答

1

我相信你想要的東西是這樣的:

public class MyClass extends MyAbstractClass<MyObject> { 
    @Override 
    protected List<MyObject> MyMethod(List<String> list){ 
     //Do Stuff 
    } 

} 
+0

:P是的,就是這樣。我不認爲這會解決我的問題,因爲它抱怨一個與MyObject無關的參數。 – CovaDax

1

我想你的意思是說

public class MyClass extends MyAbstractClass<MyObject> 

它會說,MyClass使用MyObject的類型參數T

你所說的是MyClass有一個類型參數,它與基類的類型參數T沒有任何關係。所以在這種情況下,MyAbstractClass參考可能指向MyClass實例,並且該參考的用戶無需知道他們有MyClass,因此他們不能受到T必須爲MyClass的限制。

0

將其更改爲

extends MyAbstractClass<MyObject> 

在Eclipse測試它與工程。

它也似乎是邏輯,因爲超類只能知道你想要返回什麼類型,如果你給它的類型。如果你不給它一個類型,它必須推廣。

0

的問題有歧義,所以我回答兩個可能的情況

  1. 的MyObject是一類

    public class MyClass extends MyAbstractClass<MyObject> { @Override protected List<MyObject> MyMethod(List<String> list) { // do stuff } }

  2. 您使用MyObject的只是作爲一種通用的,這樣命名它,然後, 將同一類型傳遞給父項如下

    public class MyClass<MyObject> extends MyAbstractClass<MyObject> { @Override protected List<MyObject> MyMethod(List<String> list) { // do stuff } }