sir*_*ine 2 java generics abstract-class casting subclass
我有以下抽象类:
public abstract class MyObject<T extends DescriptionItem> {
protected abstract MyObject generate(T item);
}
Run Code Online (Sandbox Code Playgroud)
它有以下子类:
public class AudioObject extends MyObject<PlayNowDescriptionItem> {
@Override
protected MyObject generate(PlayNowDescriptionItem item) {
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
PlayNowDescriptionItem扩展了DescriptionItem.我还有一个用于生成对象的工厂类.
public class ObjectFactory {
public MyObject generateCastObject(DescriptionItem item) {
if (item instanceof PlayNowDescriptionItem) {
return new AudioObject(context).generate(item);
}
Run Code Online (Sandbox Code Playgroud)
我认为这样可以正常工作,因为PlayNowDescriptionItem是DescriptionItem的子节点,但我在下一行中收到错误.
return new AudioObject(context).generate(item);
Run Code Online (Sandbox Code Playgroud)
AudioObject中的PlayNowDecriptionItem无法应用于DescriptionItem.
谁能看到我在这里做错了什么?
你需要投你DescriptionItem
到PlayNowDescriptionItem
是这样的:
return new AudioObject(context).generate((PlayNowDescriptionItem)item);
Run Code Online (Sandbox Code Playgroud)
当你定义generate方法来接受DescriptionItem的子类时(请注意,类PlayNowDescriptionItem
的对象也是类的对象,DescriptionItem
但相反的并不总是有效的,例如.可能是一个PlayAfterDescriptionItem
不是a 的子类PlayNowDescriptionItem
)