Javaで奇妙なエラーこれはokです:ジェネリック
Class<? extends String> stringClass = "a".getClass();
しかし、これはエラーを取得します。
<T> void f(T obj) {
Class<? extends T> objClass = obj.getClass();
}
私は同じようにキャストすることができます知っている:
<T> void f(T obj) {
@SuppressWarnings("unchecked")
Class<? extends T> objClass = (Class<? extends T>) obj.getClass();
}
しかし、なぜ以前のエラー? Java 7の次のリリースではそのような使用法がサポートされる予定ですか?
EDITは
私は型消去を扱う問題はない、と私のコードは正しいですが、コンパイラはそれをサポートしていない時はいつでもちょうど余分SuppressWarnings
を置きます。
背後にある質問はSuppressWarnings
で十分ではありません。 T.getClass() => ? extends T
が明らかに直感的な場合、なぜ警告を抑制する必要がありますか?
すでにjavadocの見てきたように:私たちは、Javaのジェネリックについて話すとき
The actual result type is Class where |X| is the erasure of the static type of the expression on which getClass is called.
Object.getClass()
は特殊なケースです。これは、宣言されたフォームとは異なり、ちょうどClasss<?>
を返します。 Eclipse IDEのようなIDEがどのように実装されているのか分かりませんが、Eclipse IDEで完成するとClass<?>
の代わりにClass<? extends |X|>
が生成されます。私は基本クラスを作るために、Objectクラスにいくつかの魔法のものがあると思いますか?派生型から拡張され、派生型間で異なる。したがって、Java言語で独自のObjectクラスを作成することはできません。? extends |X|
のようなものが返されます。|X|
はthis.getClass()
です。しかし、JavaのObject
は、特別なケースです。
これは間違いありませんが、OPが尋ねる問題は、2番目の例がコンパイルされない理由です: 'found:java.lang.Class required:java.lang.Class extends T> 'を継承します。 –