これは以前にここで質問された(そして回答された)と思われますが、問題の名前を付ける方法がわかりません。クラス自体を渡していない場合にのみ、問題なくワイルドカードを表現できるのはなぜですか?
すべてはこのコードに集約されます。への呼び出しを除いて、すべてが期待どおりに機能しますgenericsHell(ShapeSaver.class)
。
interface Shape { }
interface Circle extends Shape { }
interface ShapeProcessor<T extends Shape> { }
class CircleDrawer implements ShapeProcessor<Circle> { }
class ShapeSaver<T extends Shape> implements ShapeProcessor<T> { }
class Test {
void genericsHeaven(ShapeProcessor<? extends Shape> a) {}
void genericsHell(Class<? extends ShapeProcessor<? extends Shape>> a) {}
void test() {
genericsHeaven(new CircleDrawer());
genericsHeaven(new ShapeSaver<Circle>());
genericsHell(CircleDrawer.class);
genericsHell(ShapeSaver.class); // ERROR: The method genericsHell is not applicable for the arguments (Class<ShapeSaver>)
}
}