1. ホーム
  2. java

[解決済み] Illegal generic type for instanceof" と表示されるのですが?

2022-02-10 06:34:36

質問

与えられた。

public class C<T> {
    private class D {
        public boolean equals( Object o ) {
            if ( !(o instanceof D) )    // line 4
                return false;
            D other = (D)o;             // line 6
            return i == other.i;
        }
        int i;
    }
}

得ることができる。

C.java:4: illegal generic type for instanceof
          if ( !(o instanceof D) )
                              ^

また、6行目について "unchecked cast" という警告が表示されます。 なぜですか? その o ではない は汎用型です。 Object . を正しく実装するにはどうしたらよいでしょうか。 equals() のインスタンスをチェックし、キャストすることで、このようなことが可能になります。 D ?

注:もちろん、このコード例は私の実際のコードから削られたものである。 実際のクラスは CD はもっと大きくなり Dprivate の内部クラスです。 C その実装で使用される。

参考:本当の D は、ジェネリックパラメータ T .

解決方法は?

<ブロッククオート

oはジェネリック型ではなく、単なるObjectです。

問題はそこではありません。 問題なのは......そして両方のコンパイルエラーの根本的な原因も......それは D はジェネリッククラスです。 そして、ジェネリッククラスの中にある非静的なネストされたクラスなので、ジェネリックなのです。 その完全修飾名は次のようになります。 some.pkg.C<T>.D .

参考:実際のDはジェネリックパラメータTを使用している。

そして、その事実が かもしれない を利用する TD は汎用クラスです。

を使用できない理由は instanceof D または (D) は一般的な型消去です。 基本的にランタイムは、(例えば) C<String>.DC<Integer>.D . そして、それができないので、次のことを判断することができません。 instanceof D を返すべきでしょう。 true または false または (D) が成功するか、あるいは ClassCastException .

一つの解決策は D をstaticにしました。 なぜなら、静的なクラスは、包含するクラスからジェネリック型のパラメータを使用することができないからです。 あなたの"FYI"には、それができると書かれています。

もうひとつの解決策は、外側のクラスをインスタンス化することです。 C の実際の型を渡します。 T として java.lang.Class<T> のインスタンスを作成します。 そして、この Class インスタンスを作成し、必要に応じて実行時の型チェックとキャストを実装します。 これは面倒なことになりそうです。

3つ目の解決策は 慎重に コードを解析し、@SuppressWarning アノテーションを使用して "unsafe cast" などの警告を抑制することが安全かどうかを判断します。

<ブロッククオート

型消去とは?'o'は直接Object型です。

実は Object 宣言された の型は o という変数があります。 実際のオブジェクトは他の型を持っている可能性が高く、それは その という型(もしそれが D のインスタンスなど)が型消去されたことになる。