我不明白为什么这会混淆编译器。我使用泛型类型T
来保存与put
和get
方法无关的对象。我一直认为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);
}
}
}
答案 0 :(得分:8)
关于原始类型如何工作的事情 - 你遗漏了参数的泛型类型 - 是所有泛型,它们的方法也被删除了。因此,对于原始GenericClass
,get
和put
方法也会丢失其泛型。
答案 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中提及。