这里的Java新手,请轻柔地对待我。我对Python和Ruby等鸭式语言有丰富的经验,但是对静态类型的语言却没有太多的经验,而Java的使用经验实际上为零。
我有一个对象数组,它们都是Cause
class(即ArrayList<Cause>
)的所有实例。我想知道这些对象中是否有一个与特定值匹配的属性upstreamRun
。问题在于,只有UpstreamCause
个对象具有此属性(UpstreamCause
是Cause
的子类),并且数组中的所有对象并非都是UpstreamCause
实例。>
这是我第一次尝试:
causes.stream().anyMatch((Cause c) -> c instanceof hudson.model.Cause.UpstreamCause && c.getUpstreamRun() == run);
当然,由于upstreamRun()
父类上未定义Cause
,因此无法编译:
[ERROR] /home/jay/local/data/sis/workspace/henlo-world-plugin/src/main/java/org/jenkinsci/plugins/sample/HelloWorldAction.java:[17,138] cannot find symbol
symbol: method getUpstreamRun()
location: variable c of type hudson.model.Cause
我也尝试了其他一些方法,但是所有这些方法都无法编译:
causes.stream().anyMatch((hudson.model.Cause.UpstreamCause c) -> c instanceof hudson.model.Cause.UpstreamCause && c.getUpstreamRun() == run);
和
causes.stream().anyMatch((Cause c) -> c.getClass().getMethod("getUpstreamRun", null) != null && c.getClass().getMethod("getUpstreamRun").invoke(c) == run);
我知道我可能采用了错误的方式,因为据我了解,Java开发人员认为反射和instanceOf
是代码的味道。那么解决这个问题的正确方法是什么?
如果这是Ruby,我会这样做:
causes.any? do |c|
c.getUpstreamRun() == run
rescue NoMethodError => e
false
end
但是我猜想这种方法在Java中是回避的,即使不是,我也不知道如何用Java编写等效方法。