我有一个这样的超类:

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抽象化来确保避免这种情况。 (请注意,抽象类仍可以具有字段。)

10-05 17:58