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

Java 当您忽略参数类型时,为什么泛型被完全禁用?,java,generics,Java,Generics,作为后续,首先是背景 给定具有此声明的类: public class SomeClass<T> SomeClass上的方法声明如下: protected Map<String, Object> getMap(Object param) { } protectedmap-getMap(对象参数){ } 如果子类像这样调用该方法: Map<String, Object> val = getMap(param); Map val=getMap(param);

作为后续,首先是背景

给定具有此声明的类:

public class SomeClass<T>
SomeClass上的方法声明如下:

protected Map<String, Object> getMap(Object param) {
}
protectedmap-getMap(对象参数){
}
如果子类像这样调用该方法:

Map<String, Object> val = getMap(param);
Map val=getMap(param);

编译器本质上抱怨getMap返回一个普通映射,并且有一个未经检查的赋值给泛型映射。为什么会这样?这是对泛型的一种记录在案的期望吗?这是有原因的吗?

我不太清楚这样做的理由,但这种行为在:

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


考虑到在新代码中使用原始类型是非常不受欢迎的,我想他们只是想简单地了解原始类型和参数化类型之间的交互规则。

这是一个奇怪的问题。但是,通过扩展
SomeClass
而不是
SomeClass
,您似乎总能在不引入任何问题的情况下消除错误:

public class SomeSubClass extends SomeClass<Object> {
    ...
}
公共类SomeSubClass扩展了SomeClass{
...
}

您能否发布确切的异常和真实的代码示例?你发布的内容很难精确定位。如果你看一看链接的问题,你就有了一个真实的例子。相关问题解释得很好,大部分是正确的,但不完全正确。对于像“SomeClass obj=new somsublass()”这样的表达式,当使用原始超类型时,该表达式有效,但当使用SomClass作为超类型时,该表达式无效。如果为泛型对象赋值,则该类应为泛型。您的Java编译器将给出关于这一行的警告,这是理所当然的。我认为其基本原理与此类似,需要很多模糊的规则+不应鼓励使用原始类型。
public class SomeSubClass extends SomeClass<Object> {
    ...
}