是否可以在不为下面的代码定义其他变量或类型强制转换的情况下,以弱推断来解决问题?

public class GenericClass<T> {
    public <R> R m(Class<R> cl) {
        return null;
    }
}

GenericClass<SomeClass> v2 = new GenericClass<SomeClass>()
    .m(GenericClass.class)
    .m(GenericClass.class); // <- Object cannot be converted to GenericClass<SomeClass>

最佳答案

是:

public class GenericClass<T> {
    public <R> R m(Class<? super R> cl) {
        return null;
    }
}

GenericClass<SomeClass> v2 = new GenericClass<SomeClass>()
    .<GenericClass<SomeClass>>m(GenericClass.class)
    .m(GenericClass.class);


我们需要解决以下事实:cl可能是已擦除类型(即泛型类型R的超类型),然后我们需要告诉编译器,真正的类型R是什么,因为该方法参数仅指示超级类型。

m的第二次调用不需要指定泛型,因为它是从分配中推断出来的。

10-08 01:28