2016-10-17 6 views
1

私は定義し、オブジェクトのリストをパラメータとして取る抽象的なセッターを実装しようとしています。この簡単なアイデアの要点は次のとおりです。Listパラメータで汎用メソッドを実装する

public abstract class MyClass { 
    public abstract void setThings(List<?> things); 
} 

public class Bar extends MyClass { 
    private List<String> things; 

    @Override 
    public void setThings(List<String> things) { 
     this.things = things; 
    } 
} 

これは機能しません。私はMethod does not override method from its superclassboth methods have the same erasure, but neither overrides the otherを得ます。私は、消去に関連する後者のエラーを理解していますが、これを行う正しい方法を理解できません。私はいくつかの他のものを試しました:

public abstract <T> void setThings(List<T> things); 

...その他いくつかを試しました。そして、私は他の質問/答えを見つけましたが、これに対処することに近づいていますが、確かに答えはありませんでした(少なくともそれは私には分かりませんでした)。私はthe tutorialsを読んだこともありません。私は何が欠けていますか?

答えて

3

Javaでは、抽象メソッドsetThingsを実装していないことを、List<?>List<T>またはList<String>ではありません)を実装していないということを正しく認識しています。これらはすべて異なるものです。 this question for a detailed explanationを参照してください。おっと、私はちょうど私の例では、 `abstract`クラス修飾子を忘れてしまったの

public abstract class MyClass<T> { 
    public abstract void setThings(List<T> things); 
} 

public class SubClass extends MyClass<String> { 
    private List<String> things; 

    public void setThings(List<String> things) { 
     this.things = things; 
    } 
} 
+0

ありがとう、私はあなたの例を行って、それはうまく動作しています。私はジェネリックスを研究するためにもう少し時間をかけなければならないでしょう。微妙なものの中には、 '?'、 'T'、' E 'などの使い方の違いなど、まだ少し神秘的です。救済できません! – Madbreaks

2

List<?> thingsは、不明なタイプのリストです。

List<T> thingsは、タイプTのリストです。

これら2つのものは同じではないため、コンパイルエラーが発生しています。

エラーを根絶するために賢明な方法はいくつかあります:

  • Generify両方のクラス

    abstract class MyClass<T> { 
        public abstract void setThings(List<T> things); 
    } 
    
    class Bar<T> extends MyClass<T> { 
        private List<T> things; 
    
        @Override 
        public void setThings(List<T> things) { 
         this.things = things; 
        } 
    } 
    
  • Bar

    abstract class MyClass { 
        public abstract void setThings(List<?> things); 
    } 
    
    class Bar extends MyClass { 
        private List<?> things; 
    
        @Override 
        public void setThings(List<?> things) { 
         this.things = things; 
        } 
    } 
    
  • だけでなく、未知のタイプのリストを受け入れてください
+0

が、私は私の実際のコードでそれを持っている:

最も簡単な解決策は、同様にあなたの抽象クラスのためのジェネリックを導入することです。私はこれを反映するために質問を更新しました。しかし、私は私のサブクラスに具体的な型が必要です。 – Madbreaks

関連する問題