编程语言
首页 > 编程语言> > java-反向转换番石榴谓词

java-反向转换番石榴谓词

作者:互联网

我有一个谓词< Object>并且需要等价的谓词< Animal>.

Predicate<Animal> provideIsSentientPredicate() {
    // Won't compile -- cannot convert from Predicate<Object> to Predicate<Animal>
    return Predicates.instanceOf(Human.class);
}

谓词是互变的,因此要转换谓词“对象”.谓词< Animal>是安全的.是否存在从Predicate< Object>转换的清晰易读的方法.谓词< Animal> (例如,不取消警告)?

我不希望更改方法的类型签名以返回Predicate&lt ;?超级动物或谓词< Object>除非有人说服我这是正确的做法.

解决方法:

Predicate<Animal> provideIsSentientPredicate() 
{
    return cast( Predicates.instanceOf(Human.class) );
}

static <A, B extends A> Predicate<B> cast(Predicate<A> pa)
{
    @SuppressWarnings("unchecked")
    Predicate<B> pb = (Predicate)(pa);
    return pb;

    // we know it works correctly in practice.
    // or if you are a theorist, create a wrapper predicate
    //
    //     Predicate<B>
    //         boolean apply(B b)
    //             return pa.apply(b);
}

顺便说一句,Guava没有理由不应该将该方法声明为

static <T> Predicate<T> instanceOf(Class<?> clazz)

与其他同级方法一致.

标签:generics,guava,contravariance,java
来源: https://codeday.me/bug/20191031/1972065.html