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

我不明白为什么这会混淆编译器。 我使用generics类型T来保存与putget方法无关的对象。 我一直认为GenericClassGenericClass在function上是相同的,但我必须弄错。 编译DoesntWork类时,我得到incompatible types - required: String - found: ObjectWorks类完成了我的期望。 这里发生了什么?

 public class GenericClass { public  void put(Class key, V value) { // put into map } public  V get(Class 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 genericClass = new GenericClass(); String s = genericClass.get(String.class); } } } 

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

这是因为当您使用generics类而没有额外的类型信息时,您可以使用有时称为类的degenerateforms的类。 degenerateforms删除了所有通用类型信息。

基本上 – 你的class级变成了这样的东西:

 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中提到过。