传递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

我在使用Java谓词时遇到问题

我有一个枚举:

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))