我有一个像这样的超类:
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()
是否有一个很好的解决方案来避免这种情况?
由于
编辑编辑编辑编辑
从Android Intents中检索GenericUpdate
类的实际实例,它们的检索方式如下:
genericUpdate=intent.getParcelableExtra(GENERIC_UPDATE);
他们被置于这样的意图中:
GenericUpdate genericUpdate=((FlowAdapter)parent.getAdapter()).getItem(position);
//...
intent.putExtra(PostDetailActivity.GENERIC_UPDATE,genericUpdate);
//...
答案 0 :(得分:2)
也许你需要界面?
public interface GenericUpdate{
//...other stuff...
public String getName();
}
public class FromFriend implements GenericUpdate {
@Override
public String getName() {return getFriend().getName();}
}
或者这个:
public class FromArtist implements GenericUpdate {
@Override
public String getName() {return getArtist().getName();}
}
然后没有人可以在列表中添加一个非有效对象,如果你有一个实现这个接口的对象实例,那么应该总是有一个有效的实现方法。
接口角色就是告诉别人他们应该实现什么,所以你可以使用一些使用这种实现它的对象的抽象算法。
你不能实例化纯粹的界面,你需要实现它,这保证你,每个对象都有实现,应该是有效的。
答案 1 :(得分:2)
从上面的语句中,类GenericUpdate
有一个返回null的方法getName()
。如果您正确观察,也可以实例化此类。因此,如果您有GenericUpdate
个类的列表,它们将始终返回null,因为getName()
方法始终返回null
。
如果您不希望实例化Generic
类,可以执行以下操作:
public abstract class GenericUpdate{
public abstract String getName();
}
然后,您现在可以按照自己的方式扩展课程。
现在,要使用GenericUpdate
' getName()
方法,您必须执行以下操作:
GenericUpdate fromFriend = new FromFriend();
fromFriend.getName();
只要实现中的getFriend().getName();
方法具有值且不为null,就不会为GenericUpdate返回null。
另一种选择是使用Krzysztof Cichocki上面的答案。
答案 2 :(得分:2)
Java中的所有方法都是virtual,因此您无法意外地"在子类的对象上调用基类方法。
要查看列表中对象的运行时类型,您可以打印genericUpdate.getClass().toString()
。
如果此项提供class com.mypackage.javaclasses.FromFriend
,那么getFriend.getName()
很可能会返回null
。如果这给了class com.mypackage.javaclasses.GenericUpdate
你的对象不是正确的子类型,那么getName
的子类实现就不会被调用就不足为奇了。
(在这种情况下,原来是后者。)
因此,如果您可以控制GenericUpdate
类的代码,则可以通过使GenericUpdate
抽象来确保避免这种情况。 (请注意,抽象类仍然可以包含字段。)