Я подозреваю, что это было задано здесь (и ответили) раньше, но я не знаю, как назвать проблему. Почему я могу выразить подстановочные знаки без проблем только тогда, когда я не передаю сам класс?
Все это сводится к этому коду. Все работает как ожидалось, кроме вызова 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>)
}
}