我想,我现在会理解Java泛型。但现在我又无助了。
我有一个泛型类,其中c-tor构造正确类型的实例,而静态工厂方法产生类型不匹配。
请查看以下代码:
public class _GenericFactoryMethods {
public final static class DemoClass<T1, T2> {
private final T1 _1;
private final T2 _2;
// static factory method
public static <T1, T2> DemoClass<T1, T2> create(T1 _1, T2 _2) {
return new DemoClass<T1, T2>(_1, _2);
}
// usual c-tor
public DemoClass(T1 _1, T2 _2) {
this._1 = _1;
this._2 = _2;
}
public T1 get1() { return _1; }
public T2 get2() { return _2; }
}
public void doSomething() {
String str = "test";
Class<? extends CharSequence> _1 = str.getClass();
CharSequence _2 = str;
// works
DemoClass<Class<? extends CharSequence>, CharSequence> dc1 =
new DemoClass<Class<? extends CharSequence>, CharSequence>(_1, _2);
// compile error
DemoClass<Class<? extends CharSequence>, CharSequence> dc2 =
DemoClass.create(_1, _2);
}
}
错误是:
Uncompilable source code - incompatible types
required: _GenericFactoryMethods.DemoClass<java.lang.Class<? extends java.lang.CharSequence>,java.lang.CharSequence>
found: _GenericFactoryMethods.DemoClass<java.lang.Class<capture#794 of ? extends java.lang.CharSequence>,java.lang.CharSequence>
请帮助理解并解决这个问题 (对于某些类,我真的需要静态工厂方法)。
修改
有人也可以解释为什么必须使用显式类型参数?
答案 0 :(得分:6)
尝试
DemoClass.<Type1, Type2>create(_1, _2);
我记得Josh Bloch对他的Effective Java第二版的介绍:“每当你指定一个明确的类型参数时,上帝会杀死一只小猫”。尽量避免像这样的结构。
答案 1 :(得分:1)
在这种情况下,您必须显式设置泛型类型:
dc2 = DemoClass.<Class<? extends CharSequence>, CharSequence>create(_1, _2);