6

我不明白为什么这会使编译器感到困惑。我使用泛型类型来保存与and方法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

8

关于原始类型如何工作的事情——你忽略了参数的泛型类型——是它们的所有泛型及其方法也被删除了。所以对于 raw GenericClassgetandput方法失去了它们的泛型。

于 2013-03-31T22:29:30.263 回答
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 回答