我有一个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>
除非有人说服我,是做正确的事。
可选的相关问题:http://stackoverflow.com/questions/7848789/how-to-use-guava-optional-as-naturally-covariant-object – 2013-04-22 17:20:30
“Predicates.instanceOf”的类型绝对是为了推你要么返回一个'谓词<?超级动物>',或者返回'Predicate
@Louis哇!真?那完全不是我的期望!我一直认为用一个通配符类型来处理客户端是很粗鲁的,所以我从来没有写过一个带有通配符返回类型的方法。通配符返回类型是否被认为是良好的实践?我无法回想起Guava源代码树中返回通配符类型的任何方法 - 有没有一种方法? – 2013-04-22 17:57:08