1

インターフェイスにジェネリック型引数があります。インターフェイスを実装するすべてのクラスは、この型を宣言する必要があるため、後でそれを使用するユーザーは、何が返されるかを知ることができます。ここで、これらのクラスを instanceof でチェックして、それらが Action のインスタンスであるかどうかを確認する必要があります。

私の質問は: 私がした場合、instanceof は何を返すでしょうか:

if (SomeAction instanceof Action<?>) {
    . . .

}

このSomeActionクラスで:

public class SomeAction implements Action<String> {
    . . .

}

true を返しますか、それとも false を返しますか? そして、私がした場合はどうなりますかSomeAction instanceof Action<Integer>

4

2 に答える 2

3

を使用する場合、Javaはジェネリック型を気にしませんinstanceofJavadocsを引用するには:

Java コンパイラはジェネリック コード内のすべての型パラメーターを消去するため、ジェネリック型のどのパラメーター化された型が実行時に使用されているかを確認できません。

したがって、Action<?>またはに対してテストできますActionが、 に対してテストしようとすると、コンパイラ エラーが発生しますAction<Integer>。エラーメッセージは非常に有益です:

パラメーター化された型 Action<Integer> に対して instanceof チェックを実行できません。それ以上のジェネリック型情報は実行時に消去されるため、代わりにフォーム Action<?> を使用してください

于 2013-05-25T17:01:26.070 に答える