2016-07-21 66 views
4

我有一个泛型类MyClass<T>使用静态工厂方法和setter方法:Java泛型:不兼容的类型

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> 

回答

5

请注意,你有你的信息,例如工作,并且具有编译错误的一行代码之间失踪。

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

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

所以它知道你会'说话串'它。

+0

感谢你这么多!它正在工作! –

1

在第二个语句中,您没有定义类型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); 
+0

非常感谢你!这个解决方案也适用! –