[解決済み] Illegal generic type for instanceof" と表示されるのですが?
質問
与えられた。
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
?
注:もちろん、このコード例は私の実際のコードから削られたものである。 実際のクラスは
C
と
D
はもっと大きくなり
D
は
private
の内部クラスです。
C
その実装で使用される。
参考:本当の
D
は、ジェネリックパラメータ
T
.
解決方法は?
<ブロッククオートoはジェネリック型ではなく、単なるObjectです。
問題はそこではありません。 問題なのは......そして両方のコンパイルエラーの根本的な原因も......それは
D
はジェネリッククラスです。 そして、ジェネリッククラスの中にある非静的なネストされたクラスなので、ジェネリックなのです。 その完全修飾名は次のようになります。
some.pkg.C<T>.D
.
参考:実際のDはジェネリックパラメータTを使用している。
そして、その事実が
かもしれない
を利用する
T
は
D
は汎用クラスです。
を使用できない理由は
instanceof D
または
(D)
は一般的な型消去です。 基本的にランタイムは、(例えば)
C<String>.D
と
C<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
のインスタンスなど)が型消去されたことになる。
関連
-
[解決済み】Android Studio クラス org.codehaus.groovy.runtime.InvokerHelper を初期化できませんでした。
-
[解決済み] java のクラス内のコンストラクタは、指定された型に適用できない
-
[解決済み】ソースルート外のJavaファイル intelliJ
-
[解決済み] "java.nio.charset.MalformedInputException" を避けるために、すべての包括的なCharset。入力の長さ= 1"?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] 汎用型Tのクラスインスタンスを取得する方法を教えてください。
-
[解決済み] 汎用クラスやメソッドのメンバからTの型を取得する方法
-
[解決済み] メソッドの戻り値の型を汎用的にするにはどうすればよいですか?
-
[解決済み] GsonでList<T>オブジェクトをデシリアライズする?
-
[解決済み】java.util.Listのジェネリックタイプを取得する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】popBackStack()とreplace()の操作はどう違うのですか?
-
[解決済み】"比較メソッドはその一般契約に違反する!"
-
[解決済み】"|="の意味は何ですか?(パイプ等号演算子)
-
[解決済み】Javaクラスの "型に解決できない"
-
[解決済み】Javaを使用するSelenium - ドライバの実行ファイルのパスは、webdriver.gecko.driverシステムプロパティで設定する必要があります。
-
[解決済み】Hibernateの例外「failed to lazily initialize a collection of role」の解決方法
-
[解決済み】Javaメソッドスタブ
-
[解決済み] StringBuilderをクリアまたは空にするにはどうすればよいですか?重複] [重複] [重複] [重複] [重複] [重複
-
[解決済み】どういう意味か。Serializableクラスがstatic final serialVersionUIDフィールドを宣言していないとは?重複している] [重複している] [重複している] [重複している
-
[解決済み】CreateProcess error=2, The system cannot find file specified.