2017-09-15 9 views
0

Typeのクラスを返すメソッドを定義すると、Baseを拡張するすべての型でメソッドをオーバーライドできないはずですか?安全でない型キャスト警告を与えるコレクションを返す汎用メソッド

MultiEntryModel.java(親クラス)

protected abstract <T extends Model> List<T> getDataList(); 

ProgramData.java

public class ProgramData extends MultiEntryModel { 
    ... 
     @Override 
     protected List<Program> getDataList() { 
      return programs; 
     } 
} 

Program.java

public class Program extends Model { 
    ... 
} 

私は危険なタイプを取得しています:以下の例を見てみましょうPrograms.javaで警告をキャストしますが、Modを拡張するProgram型のオブジェクトを含むListを返していますこれは、基底クラス<T extends Model>のメソッドシグネチャで示されているとおりです。どうして?

+0

ポスト正確かつ完全なエラーメッセージとともに、問題を再現する完全な最小限の例。投稿したコードにはキャストは一切ありません。 –

+0

キャスティングがありません。この警告は、メソッドがオーバーライドされている時点でPrograms.javaに表示されます。 – user1452030

答えて

6
protected abstract <T extends Model> List<T> getDataList(); 

これは、リストがどのTのために安全でなければならどの返されることを意味します。たとえば:あなたは戻っているリストがList<Program>ある場合

List<SomeModel> someModelList = thing.getDataList(); 

、これは安全ではないとしている - あなたがそのリストにSomeModelを追加することができますので、および/または、あなたはからSomeModelを取得しようとすることができますリスト。 Programがサブタイプ/スーパータイプProgramである場合、これらの操作の1つのみが安全です。そうでなければ、どちらも安全ではありません。

は、メソッドに型変数を定義しないでください - クラスにそれを置く:

abstract class TheClass<T extends Model> { 
    protected abstract List<T> getDataList(); 
} 

class ProgramClass extends TheClass<Program> { 
    protected List<Program> getDataList() { return programs; } 
} 
+1

非常に興味深くよく説明されています。ありがとうございました! :) – user1452030

+2

呼び出し側は 'Model'の既存のサブクラスに束縛されません。 ' List getDataList()'のシグネチャでは、 'List <?extends? ExecutorService> list = getDataList(); '、' ExecutorService'を実装する 'Model'サブクラスのインスタンスのリストを返すことを期待しています。 – Holger

関連する問題