我有一個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