私はできるだけ少ないコード量でこの問題を凝縮しようとしました。戻り値のJava型パラメータの問題
私は、データベーステーブルのように、とTable
のクラスを持つテーブル構造を定義しました。 A Table
は基本的にのリストです。私はサブクラスがTable
とという特定のフレーバーを定義し、あるタイプの行を互換性のない型に入れるという不適切な試みをキャッチするようにします。
抽象Agent
クラスは、パラメーターを取り、タイプT
の行を取るテーブルを返すメソッドを提供します。私は、私が持っている問題を説明する3つの方法を定義しました。
FinalAgent
、FinalTable
、及びFinalRow
クラスはAgent
、Table
、及びクラスの実装を定義します。最終的には、私が望むのはmethod2a
です。これはパラメータのリストを取り、タイプFinalTable
のテーブルを返します。
public abstract class Row {}
public abstract class Table<T extends Row> {}
public abstract class Agent {
public <T extends Row> Table<T> method1(List<String> parameter) {
return null;
}
public <T extends Row> Table<T> method2a(List<String> parameter) {
return null;
}
public <T extends Row> Table<T> method2b(String parameter) {
return null;
}
}
public class FinalRow extends Row {}
public class FinalTable extends Table<FinalRow> {}
public class FinalAgent extends Agent {
@Override
public <T extends Row> Table<T> method1(List<String> parameter) {
return null;
}
@Override
public FinalTable method2a(List<String> parameter) {
return null;
}
@Override
public FinalTable method2b(String parameter) {
return null;
}
}
一番下に
:FinalAgent
コンパイルの
method1
が、私は、メソッドを呼び出すためにTable<FinalRow> t1 = new FinalAgent().method1(null);
を記述する必要があります。FinalAgent
のmethod2a
私は私が実際に(私はFinalTable t2a = new FinalAgent().method2a(null);
を書きたい)戻っています何を反映するためにFinalTable
に戻り値の型を変更しましたが、コンパイラはエラーを生成します。型FinalAgentの方法method2a(リスト)をオーバーライドまたは実装する必要がありますスーパータイプメソッドmethod3
パラメータをList
からString
に変更しました。このメソッドはOKをコンパイルしますが、少なくとも私は型の安全に関する警告を出します。
だから、最終的には、質問:それはFinalAgent
でmethod2a
がmethod2b
がコンパイルんまだコンパイルされませんコンパイラのバグですか?
私もやっているかもしれませんが、私がやっていることをする良い方法がありますか?
@ElliottFrisch? – shmosel
@shmosel私の誤りは、私は 'FinalTable'の宣言でジェネリック型を見逃しました。 –
それは不思議な矛盾です。 – shmosel