ステファンHarbich:
以下の簡単な例を考えてみましょう。
package com.test;
class B<S> {
B(Class<S> clazz) {}
}
class A<T> {
class SubB extends B<SubB> {
SubB() {
super(SubB.class);
}
}
}
に位置誤差とプログラム終了を開始するとき、実際のコンパイルを(コンパイルエラーが存在する場合、それは通常ように)IntelliJの任意のエラーを示していないがsuper(SubB.class);
。
エラー:(8、23)のjava:互換性のない型は:
java.lang.Class<com.test.A.SubB>
に変換することはできませんjava.lang.Class<com.test.A<T>.SubB>
私は好奇心、なぜこの出来事はありますか?そして、どのように私はそれを解決するだろうか?
コンパイルはAdoptOpenJDK 11で行われます。
ジョン・クーン:
この現象の理由は、少し複雑です。考えてみましょjava.util.List.class
種類を持っている、Class<java.util.List>
ではありませんClass<java.util.List<?>>
。これは、クラスリテラルの制限です。
あなたの例では、SubB.class
型を持つClass<com.test.A.SubB>
SUBBの生タイプで再び、。しかし、コンストラクタは、いくつかの種類を期待しますClass<com.test.A<T>.SubB>
。
我々はそれが希望の型にリテラルをキャストする必要がある理由です。
super((Class<SubB>) (Class<?>) SubB.class);
これは警告が生成されますが、迅速な審査が心配する必要はありませんと表示されます。