私は、関数を2つのインタフェースを実装することが保証されているオブジェクトを返すようにしたいと思います。正確なオブジェクトは、コンパイル時に必ずしも知られているわけではありません。私は次のエラーを取得するコンパイルしようとするとジェネリック型の戻りの交差
class HelloWorld {
public interface A {}
public interface B {}
public static class C implements A, B {}
public static class D implements A, B {}
public static <T extends A & B> void g(T t) {}
public static <T extends A & B> T f(boolean b) {
if (b)
return new C(); // Doesn't compile
return new D(); // Doesn't compile
}
public static void main(String []args){
g(f(true));
g(f(false));
<what_should_I_write_here> x = f(<user_inputted_boolean>);
}
}
:私のコードは次のように見えますが、二つの異なる機能の種類とC
を返すことができませんので
HelloWorld.java:13: error: incompatible types: C cannot be converted to T
return new C();
^
where T is a type-variable:
T extends A,B declared in method f(boolean)
HelloWorld.java:14: error: incompatible types: D cannot be converted to T
return new D();
^
where T is a type-variable:
T extends A,B declared in method f(boolean)
これは動作しませんし、 D
は異なるタイプです。
上記のコードをコンパイルする方法はありますか?
ありがとうございました。私の問題は、ランタイムO(n^2)を作る方法でユーザが私の関数を使用しないコンパイル時の保証であるため、関数を 'RandomAccess'' Lists'だけを受け入れるものとして宣言したいということから始めました。このような形でユーザーが誤って自分の機能を呼び出すことは望ましくありません。現在、私は与えられたリストが 'RandomAccess'のinstanceofであることをランタイムチェックしています。私はこれをコンパイル時のチェックに変更したい。残念ながら、私の関数に渡されるリストは、2番目の関数によって作成されます。この関数は常に 'RandomAccess List'を返しますが、必ずしも同じ具体的な型であるとは限りません。 –
もう1つの質問を見ましたが、そこに回答を追加します。この答えで言われているように、JREクラスは戻り値型で 'RandomAccess'を宣言していないことに注意してください。 'Arrays.asList'の結果は、適切であり、実行時に' RandomAccess'を実装するという事実にもかかわらず、コンパイル時にプロパティを強制するときメソッドによって拒否されます。 – Holger