誰かが次のような動作を私に説明できますか?addAll()コンパイラを使用したArrayListは、ジェネリックで異なる動作を示します
私はX
のリストを持っており、addAll()
メソッドを使用して要素を追加しています。これらの要素は、ジェネリック型を使用するメソッドによって返されます。メソッドgetA()
は、A
をクラスとして返す< T extends A >
を返します。方法getI()
は、I
を持つ< T extends I >
を返します(以下のコードを参照)。
差異:listX.addAll(getA())
コンパイルエラーが発生しましたが、listX.addAll(getI())
がコンパイルされます(要素がキャストされたときにランタイムエラーが発生します。X
)。
Simpifiedコード:
interface I {}
class A implements I {}
class X {}
public void test() {
List<X> listX = new ArrayList<>();
listX.addAll(getA());
listX.addAll(getI());
for (X x : listX) {}
}
public <T extends A> List<T> getA() {
return new ArrayList<>();
}
public <T extends I> List<T> getI() {
return new ArrayList<>();
}
私は何かが足りないのですか?私はコンパイルエラーを2回も受け取らないといけませんか?
Java 8ではこの動作が新しいようですが、以下のバージョンではどちらの場合でもコンパイルエラーが発生しています。
を延長しない、Xで何かを返すことができませんか?どのコンパイラを使用していますか? – shmosel
はい、複数のエラーメッセージが必要です。 –
私はBを使ってテストしました。私はEclipseコンパイラを使用しましたが、この問題は他のJava 8コンパイラでも見られます。 – firecat