当我不提供generics类型时,为什么这个类的行为会有所不同?
我不明白为什么这会混淆编译器。 我使用generics类型T
来保存与put
和get
方法无关的对象。 我一直认为GenericClass
和GenericClass
在function上是相同的,但我必须弄错。 编译DoesntWork
类时,我得到incompatible types - required: String - found: Object
。 Works
类完成了我的期望。 这里发生了什么?
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及其方法也被删除了。 因此,对于原始GenericClass
, get
和put
方法也会丢失它们的generics。
这是因为当您使用generics类而没有额外的类型信息时,您可以使用有时称为类的degenerate
forms的类。 degenerate
forms删除了所有通用类型信息。
基本上 – 你的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中提到过。