Java Generics Hell

Я подозреваю, что об этом здесь спрашивали (и отвечали) раньше, но я не знаю, как назвать проблему. Почему я могу без проблем использовать подстановочные знаки только тогда, когда я не передаю сам класс?

Все сводится к этому коду. Все работает, как ожидалось, за исключением вызова 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>)
    }
}
25
задан Jeff Axelrod 14 August 2011 в 12:51
поделиться