Java泛型:不兼容的类型

时间:2016-07-21 07:25:07

标签: java generics

我有一个泛型类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方法,用户可以设置任何扩展自&#34; CustomClass&#34;的类。

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

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> 

2 个答案:

答案 0 :(得分:5)

请注意,您的工作示例与包含编译错误的单行程序之间缺少信息。

它不知道专业化。你需要做一些像

这样的事情
MyClass.<String>with(this).setClass(MyCustomClass.class);

所以它知道你会在谈论字符串&#39;它。

答案 1 :(得分:1)

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

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

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