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