java - 逆变转换 Guava 谓词

标签 java generics guava contravariance

我有一个 Predicate<Object>并需要一个等效的 Predicate<Animal> .

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

谓词是逆变的,因此转换 Predicate<Object>Predicate<Animal>是安全的。是否有从 Predicate<Object> 转换的清晰易读的方法?到 Predicate<Animal> (例如,不抑制警告)?

我不想更改我的方法的类型签名以返回 Predicate<? super Animal>Predicate<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)

与其他兄弟方法一致。

关于java - 逆变转换 Guava 谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16152562/

相关文章:

java - s3 putObject 访问被拒绝

Java 泛型和 addAll 方法

java - 池中所有已使用的连接都处于 hibernate 状态并创建新连接

面向对象的概念

java - 引用类型依赖 - 将 Map.Entry 声明为依赖于为 TreeMap 声明的泛型类型

Java泛型多次持有相同类型的参数

java - 将 Spring Transactional 与 guava eventBus 订阅者一起使用

java - 关于 CharMatcher.WHITESPACE 实现

java - 不兼容的库版本 selenium/guava

java - 奇怪的运行时错误(声明时出现 ClassCastException)