我有一个这样的超类:
public class GenericUpdate{
//...other stuff...
public String getName(){return null;};
}
和这样的子类:
public class FromFriend extends GenericUpdate {
@Override
public String getName() {return getFriend().getName();}
}
或这个:
public class FromArtist extends GenericUpdate {
@Override
public String getName() {return getArtist().getName();}
}
现在,
其他班给我提供了
GenericUpdate
列表如果我在列表上进行迭代并调用
GenericUpdate.getName()
,则会从getName()
返回null有没有好的解决方案来避免这种情况?
谢谢
编辑编辑编辑编辑编辑
GenericUpdate
类的实际实例是从Android Intents检索的,它们的检索方式如下: genericUpdate=intent.getParcelableExtra(GENERIC_UPDATE);
他们被这样放置:
GenericUpdate genericUpdate=((FlowAdapter)parent.getAdapter()).getItem(position);
//...
intent.putExtra(PostDetailActivity.GENERIC_UPDATE,genericUpdate);
//...
最佳答案
Java中的所有方法都是virtual,因此您不能“偶然地”在子类的对象上调用基类方法。
要查看列表中对象的运行时类型,可以例如打印genericUpdate.getClass().toString()
。
如果给出class com.mypackage.javaclasses.FromFriend
,则getFriend.getName()
最有可能返回null
。如果这给出了class com.mypackage.javaclasses.GenericUpdate
,则您的对象不是正确的子类型,并且不会调用getName
的子类实现也就不足为奇了。
(结果是在这种情况下是后者。)
因此,如果您可以控制GenericUpdate
类的代码,则可以通过将GenericUpdate
抽象化来确保避免这种情况。 (请注意,抽象类仍可以具有字段。)