27

これは以前にここで質問された(そして回答された)と思われますが、問題の名前を付ける方法がわかりません。クラス自体を渡していない場合にのみ、問題なくワイルドカードを表現できるのはなぜですか?

すべてはこのコードに集約されます。への呼び出しを除いて、すべてが期待どおりに機能します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>)
    }
}
4

2 に答える 2

11

メソッドを入力genericsHellすると、コンパイルできます。

static <T extends ShapeProcessor<?>> void genericsHell(Class<T> a) {}

EDITED:これにより、コンパイラは、コンテキストから、または明示的な型をコーディングすることにより、ShapeProcessorが文字通りany ShapeProcessorではなく、パラメーターとして渡されたものと同じ型であることを指定できます。呼び出しが明示的に型指定された場合 (コンパイラが裏で行う)、コードは次のようになります。

MyClass.<ShapeSaver>genericsHell(ShapeSaver.class);

興味深いことに、 type warningが表示されますが、それでもコンパイルされます。ただし、ジェネリック型を推測するのに十分な型情報がパラメーターから利用できるため、明示的な型は必要ありません。


あなたの質問にはいくつかの宣言が欠けているので、短い自己完結型の正しい例を作成するためにそれらを追加しました-つまり、このコードはそのままコンパイルされます

static interface Shape { }

static interface Circle extends Shape { }

static interface ShapeProcessor<T extends Shape> { }

static class CircleDrawer implements ShapeProcessor<Circle> { }

static class ShapeSaver<T extends Shape> implements ShapeProcessor<T> { }

static void genericsHeaven(ShapeProcessor<? extends Shape> a) { }

// The change was made to this method signature:
static <T extends ShapeProcessor<?>> void genericsHell(Class<T> a) { }

static void test() {
    genericsHeaven(new CircleDrawer());
    genericsHeaven(new ShapeSaver<Circle>());
    genericsHell(CircleDrawer.class);
    genericsHell(ShapeSaver.class);
}
于 2011-08-14T04:14:45.000 に答える