4

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>述語は反変であるため、aから a への変換Predicate<Animal>は安全です。Predicate<Object>aからa に変換するクリーンで読みやすい方法はありPredicate<Animal>ますか (たとえば、警告を抑制せずに)?

メソッドの型シグネチャをPredicate<? super Animal>orを返すように変更Predicate<Object>したくないのは、それが正しいことだと誰かが納得しない限りです。

4

1 に答える 1

4
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)

他の兄弟メソッドと一致します。

于 2013-04-22T19:05:06.667 に答える