【问题标题】:Type inference issue for generic method泛型方法的类型推断问题
【发布时间】:2016-04-08 20:39:38
【问题描述】:

是否可以在不为下面的代码定义额外变量或类型转换的情况下解决弱推理问题?

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>

【问题讨论】:

    标签: java generics inference


    【解决方案1】:

    是的:

    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 的第二次调用不需要指定泛型类型,因为它是从赋值中推断出来的。

    【讨论】:

    • 泛型类是我无法修改的第三方库类。不过还是谢谢。
    • 然后你需要投射。
    【解决方案2】:

    为了在链中调用你的方法 m,它需要返回它的类“this”。在您的情况下是 GenericClass。这应该可以。

    class GenericClass<T> {
        public <R> GenericClass<T> m(Class<R> cl) {
            // code to do something here
            return this;
        }
    }
    

    每次调用“m”方法都会返回它自己的类,然后你可以再次调用它。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 2012-02-20
      • 2010-11-18
      • 1970-01-01
      相关资源
      最近更新 更多