传递Java谓词
我在使用Java谓词时遇到问题 我有一个枚举:传递Java谓词,java,Java,我在使用Java谓词时遇到问题 我有一个枚举: public enum ValidationErrors { INCONSISTENT_IS_CITATION_ERROR((SacmElement element)->{ return !element.getCitedElement().isPresent() || element.getIsCitation();} ); private final Predicate<? extends Sacm
public enum ValidationErrors {
INCONSISTENT_IS_CITATION_ERROR((SacmElement element)->{
return !element.getCitedElement().isPresent() || element.getIsCitation();} );
private final Predicate<? extends SacmElement> isValid;
ValidationErrors(Predicate<? extends SacmElement> isValid) {
this.isValid = isValid;
}
public Predicate<? extends SacmElement> getIsValid() {
return isValid;
}
}
这不会编译,因为类型谓词中的“方法测试(capture#1-of?扩展了SacmElement)”不适用于参数(SacmElement)
我不理解这个错误:我认为为了Java泛型的目的,类被认为是在扩展自己。我做错了什么?一个好的经验法则是PECS:。谓词是消费者,所以它应该使用
super
。使用PredicateNo,我不想允许谓词检查任何旧的对象ode>;我只希望允许检查SacmElement
或其后代的谓词。我希望一些谓词只处理SacmElement
的特定子类,如果调用test(此)会导致编译时错误
来自一个不是正确的子类的类。如果我在您的示例中使用谓词,此
是一个SacmElement
,因此getIsValid()
需要返回一个谓词
,其中X
是SacmElement
或它的超类。一个更通用的谓词仍然可以接受一个SacmElement
,但一个更具体的谓词不能。如果您有一些其他用例,您只想检查modelement
s,那么这将是一个dif使用不同泛型类型的变量。您将无法在那里使用此isValid
。仍然感到困惑。Oracle的Java教程说,“要编写适用于数字列表和数字子类型(如整数、双精度和浮点)的方法,您需要在使用谓词时指定列表,即测试(SacmElement)
方法将接受任何SacmElement
或SacmElement
的子类作为参数。记住,这是方法在一般工作中调用的方式。这与泛型无关。现在如果您有谓词
则测试(对象)
可以接受SacmElement
s及其任何子类,因为所有这些都是Object
s。这提供了您想要的差异。另一方面,如果您有谓词
,那么测试方法将是test(modelement)
并且它将接受modelement
s,但不接受SacmElements
。换句话说,使用常规的旧参数多态性来获得您想要的行为。您不需要扩展
来获得它。
if (ValidationErrors.INCONSISTENT_IS_CITATION_ERROR.getIsValid().test(this))