我有一个实现MarkerInterface的对象列表:
List<MarkerInterface> list = new ArrayList<>();
根据文件,我将Person,Biker或Dog对象添加到列表中。这些类实现了MarkerInterface。
list.add(person);
或
list.add(dog);
或
list.add(biker);
其中一些类有子类:Dog1扩展Dog,Dog2扩展Dog,... 有些类有parentId字段,有些则没有。
我想检查对象是否具有parentId字段,如果存在则打印其值。 怎么做? 我试过了:
list.get(i).getParentId();
但它不起作用,因为MarkerInterface不能有getParentId()方法(并非所有实现MarkerInterface的类都有parentId字段)。
答案 0 :(得分:1)
如果parent_id字段不存在,您想要打印什么?
您可以通过查询对象来查看它是否具有该字段 - 例如,通过使用Java Reflection来检查对象的字段。或者,正如Lashane在评论中建议的那样,您可以添加另一个界面并使用instanceof
。但我鼓励您考虑其他方法,因为显式检查类的字段或询问其运行时类型通常是设计问题的一个标志,可能会在以后再次让您感到厌烦。
另一种方法是向接口添加一个返回要打印的字符串的方法。你可以有一个返回“”的默认实现(或者你打印的任何内容而不是parent_id,这就是我引导那个问题的原因),然后在引入parent_id的基类中你可以用返回parent_id的实现覆盖
(顺便说一下,它应该按惯例拼写为parentId,但这可能对问题不重要......)
然后,您可能希望组织类层次结构,以便具有parent_id的所有内容通过公共父类获取它(以及返回它的重写实现);对您的需求可能有用也可能不实用。如果没有更高级的模式,您可以使用它来最小化代码重复,但这可能会对问题的范围进行深入研究。
答案 1 :(得分:0)
正如您所建议的那样,我创建了扩展MarkerInterface并具有getParentId()方法的ParentIdInterface。
if(list.get(i) instanceof ParentIdInterface) {
ParentIdInterface pi = (ParentIdInterface) list.get(i);
...
}
现在它正是我想要的。感谢。
答案 2 :(得分:0)
如果你想使用Java Reflection,你在类中有这样的东西:
@Bean
public EmbeddedServletContainerCustomizer cookieProcessorCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
if (container instanceof TomcatEmbeddedServletContainerFactory) {
((TomcatEmbeddedServletContainerFactory) container)
.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
context.setCookieProcessor(new LegacyCookieProcessor());
}
});
}
}
};
}
你可以得到这样的价值:
public int parentId = 3;
但我建议使用Interfaces,就像其他人已经说过的那样。