6

これがコンパイラを混乱させる理由がわかりません。およびメソッドTに関連しないオブジェクトを保持するためにジェネリック型を使用しています。私はいつもとが機能的に同一だと思っていましたが、間違っているに違いありません。クラスをコンパイルすると、 . クラスは私が期待することを行います。何が起きてる?putgetGenericClassGenericClass<Object>DoesntWorkincompatible types - required: String - found: ObjectWorks

public class GenericClass<T> {
    public <V> void put(Class<V> key, V value) {
        // put into map
    }

    public <V> V get(Class<V> key) {
        // get from map
        return null;
    }

    public static class DoesntWork {
        public DoesntWork() {
            GenericClass genericClass = new GenericClass();
            String s = genericClass.get(String.class);
        }
    }

    public static class Works {
        public Works() {
            GenericClass<Object> genericClass = new GenericClass<Object>();
            String s = genericClass.get(String.class);
        }
    }
}
4

2 に答える 2

1

これは、追加の型情報なしでジェネリック クラスを操作する場合degenerate、クラスのフォームと呼ばれることがあるものを操作するためです。フォームには、すべてのdegenerateジェネリック型情報が削除されています。

基本的に - クラスは次のようになります。

public class GenericClass {
    public void put(Class key, Object value) {
        // put into map
    }

    public Object get(Class key) {
        // get from map
        return null;
    }

    ...
}

したがって、表示されているコンパイラの応答は予想される動作です。

Java Puzzlersで言及されています。

于 2013-03-31T22:36:34.627 に答える