作为this question的后续,首先是背景
给出一个带有此声明的类:
public class SomeClass<T>
一个不使用泛型参数的子类:
public class SomeSubClass extends SomeClass
SomeClass上的方法声明如下:
protected Map<String, Object> getMap(Object param) {
}
如果子类调用这样的方法:
Map<String, Object> val = getMap(param);
编译器本质上抱怨getMap返回一个普通的Map,并且对一个通用的Map有一个未经检查的赋值。为什么会这样?这是Generics的记录预期,是否有理由?
答案 0 :(得分:1)
我不太清楚这个的基本原理,但这种行为在Java Language Specification JLS S4.8中指定:
原始类型的超类(分别是超级接口)是其任何参数化调用的超类(超接口)的擦除。
鉴于在新代码中使用Raw类型非常气馁,他们想要简单地说出Raw和参数化类型之间的交互规则。
答案 1 :(得分:1)
这是一个奇怪的。但是,似乎您可以通过扩展SomeClass<Object>
而不是SomeClass
来解决错误而不会引起任何问题:
public class SomeSubClass extends SomeClass<Object> {
...
}