【问题标题】:Java generics: incompatible typesJava 泛型:不兼容的类型
【发布时间】:2016-07-21 07:25:06
【问题描述】:

我有一个泛型类MyClass<T> 带有一个静态工厂方法和一个setter 方法:

public class MyClass<T> {
    public static <T> MyClass<T> with(Context context) {
        MyClass<T> myClass = new MyClass<>();
        myClass.context = context;
        return myClass;
    }
    public void setClass(Class<? extends CustomClass<T>> customClass) {
        ...
    }
    ...
}

使用 setter 方法,用户可以设置任何从“CustomClass”扩展而来的类。

到目前为止一切顺利。如果我这样做:

MyClass<String> myClass = MyClass.with(this);
myClass.setClass(MyCustomClass.class);

完美运行。但如果我这样做:

MyClass.with(this).setClass(MyCustomClass.class);

它不编译!编译器输出:

Error:(44, 87) error: incompatible types: Class<MyCustomClass> cannot be converted to Class<? extends MyCustomClass<Object>>

我不知道为什么它不能用第二个选项编译。 MyCustomClass 就像:

public class MyCustomClass extends CustomClass<String> 

【问题讨论】:

    标签: java generics


    【解决方案1】:

    请注意,您的工作示例和存在编译错误的单行代码之间缺少信息。

    它不知道专业。你需要做类似的事情

    MyClass.<String>with(this).setClass(MyCustomClass.class);
    

    所以它知道你会和它“说话”。

    【讨论】:

      【解决方案2】:

      在第二个语句中,您没有定义类型 T,因此由于 setClass 的限制,编译器无法编译。

      您应该在with 函数中添加T 以用于变量目的:

        public static <T> MyClass<T> with(Object context, Class<T> clazz) {
          MyClass<T> myClass = new MyClass<>();
          myClass.context = context;
          return myClass;
        }
      
      MyClass.with(this, String.class).setClass(MyCustomClass.class);
      

      或通过:

      MyClass.<String>with(this).setClass(MyCustomClass.class);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-11
        • 1970-01-01
        • 2018-08-16
        • 2011-04-18
        • 2015-07-03
        相关资源
        最近更新 更多