忽略参数类型时,为什么泛型完全禁用?

时间:2009-06-24 19:43:24

标签: java generics

作为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的记录预期,是否有理由?

2 个答案:

答案 0 :(得分:1)

我不太清楚这个的基本原理,但这种行为在Java Language Specification JLS S4.8中指定:

  

原始类型的超类(分别是超级接口)是其任何参数化调用的超类(超接口)的擦除。

鉴于在新代码中使用Raw类型非常气馁,他们想要简单地说出Raw和参数化类型之间的交互规则。

答案 1 :(得分:1)

这是一个奇怪的。但是,似乎您可以通过扩展SomeClass<Object>而不是SomeClass来解决错误而不会引起任何问题:

public class SomeSubClass extends SomeClass<Object> {
    ...
}