当我不提供泛型类型时,为什么这个类的行为会有所不同?

时间:2013-03-31 22:20:13

标签: java generics

我不明白为什么这会混淆编译器。我使用泛型类型T来保存与putget方法无关的对象。我一直认为GenericClassGenericClass<Object>在功能上是相同的,但我必须弄错。在编译DoesntWork课程时,我得到incompatible 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);
        }
    }
}

2 个答案:

答案 0 :(得分:8)

关于原始类型如何工作的事情 - 你遗漏了参数的泛型类型 - 是所有泛型,它们的方法也被删除了。因此,对于原始GenericClassgetput方法会丢失其泛型。

答案 1 :(得分: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中提及。