子类不能应用于超类Java

时间:2016-07-07 10:05:24

标签: java generics casting abstract-class subclass

我有以下抽象类:

public abstract class MyObject<T extends DescriptionItem> {

    protected abstract MyObject generate(T item);
}

具有以下子类:

public class AudioObject extends MyObject<PlayNowDescriptionItem> {

    @Override
    protected MyObject generate(PlayNowDescriptionItem item) {
        //do something
    }
}

PlayNowDescriptionItem扩展了DescriptionItem。我还有一个用于生成对象的工厂类。

public class ObjectFactory {

 public MyObject generateCastObject(DescriptionItem item) {
    if (item instanceof PlayNowDescriptionItem) {
        return new AudioObject(context).generate(item);
}

我认为这样可以正常工作,因为PlayNowDescriptionItem是DescriptionItem的子节点,但我在下一行收到错误。

     return new AudioObject(context).generate(item);

AudioObject中的PlayNowDecriptionItem无法应用于DescriptionItem。

谁能看到我在这里做错了什么?

1 个答案:

答案 0 :(得分:7)

您需要将decodeStream()投射到DescriptionItem,如下所示:

PlayNowDescriptionItem

当你定义generate方法来接受DescriptionItem的子类时(请注意,类return new AudioObject(context).generate((PlayNowDescriptionItem)item); 的对象也是类PlayNowDescriptionItem的对象,但相反的并不总是有效的,例如。是一个子类DescriptionItem,它不是PlayAfterDescriptionItem