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

Rya*_*n J 6 java generics

我不明白为什么这会混淆编译器.我正在使用泛型类型T来保存putget方法无关的对象.我一直认为GenericClass并且GenericClass<Object>功能相同,但我必须弄错.在编译DoesntWork课程时,我得到了incompatible types - required: String - found: Object.该Works班做什么,我的期望.这里发生了什么?

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Lou*_*man 8

关于原始类型如何工作的事情 - 你遗漏了论据的泛型类型 - 是它们的所有泛型及其方法也被删除了.因此,对于原始GenericClassget,put方法失去了它们的泛型.

  • 但是为了说明为什么需要这种特定行为的示例,请考虑以下示例:使用Java 1.4构建的遗留代码必须从Java 1.4中的`List` - pre-generics - 以及来自Java的`List`获得相同的行为5,改写为引入泛型.它很笨拙,但对于向后兼容性是必要的 - 但它永远不应该成为新代码的问题,因为新代码基本上不应该使用原始类型. (2认同)