在子类中擦除Java通用成员类型?

时间:2016-03-18 12:02:16

标签: java variables generics inheritance member

我有一个以下成员的班级:

public  class BaseContainer {
    protected LinkedHashMap<Enum, MyClass> places;
}

我使用受保护成员的子类:

public class NullContainer extends BaseContainer {
    public MyClass getSelectedPlace() {
        return places.values().iterator().next(); 
    }
}

我得到(在netbeans中):
错误:不兼容的类型
必需:MyClass
发现:对象

为什么我现在需要施法?类型信息怎么了?是因为继承而被删除了吗?我做错了什么。

然后似乎是我的java编译器中的一个错误。谢谢大家的帮助。

1 个答案:

答案 0 :(得分:0)

所以最后我觉得我发现答案是jdk1.7.0_51中的一个错误(我正在使用它)。 https://bugs.openjdk.java.net/browse/JDK-8061736 但是有一些意见,这不是一个错误(见bugreport的结尾):

原始类型的超类(分别是超接口)是其任何参数化调用的超类(超接口)的擦除。因此GenList是原始类型,方法getAValue的返回类型不是A或String而是Object。这与javac的输出相对应。

(我真的认为这是一个错误,因为这实现了所有这一点,现在我被迫在所有子类中抛出这个成员字段的每一个出现,这没有任何意义......)