我有一个 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/