我正在尝试解决这个看似简单的泛型转换问题:
首先,声明这个简单的通用对象:
public interface GenericObject<T> {}
第二,声明此工作接口:
public interface Generic { // I don't want to do Generic<T>
<T> void setGenericObject(GenericObject<T> obj);
}
然后,我们实现此接口:
public class GenericImpl implements Generic {
private GenericObject<String> genericObject; // This is needed
@Override
public <String> void setGenericObject(GenericObject<String> obj) {
genericObject = obj; // eclipse give me this error :
// Type mismatch: cannot convert from
// interfaces.GenericObject<String> to
// interfaces.GenericObject<java.lang.String>
}
}
如何解决此错误?
编辑:
准确地说,我要解决此问题的唯一方法是执行以下操作:
public class GenericImpl implements Generic {
private GenericObject<String> genericObject;
@SuppressWarnings("unchecked") // I don't realy like this
@Override
public <T> void setGenericObject(GenericObject<T> obj) {
genericObject = (GenericObject<String>) obj;
}
}
答案 0 :(得分:1)
真正的问题是
public <String> void setGenericObject(GenericObject<String> obj)
其中String
与您想要的java.lang.String
没有任何关系。这里的String
只是一个类型参数,其名称偶然是String
。
答案 1 :(得分:0)
情况1:
如果T
中未使用Generic
,则只需使用通配符。
class Generic {
List<?> list;
void set(List<?> list) {
this.list = list;
}
int size() {
return list.size(); // doesn't care about T
}
}
情况2:
如果T
仅用作局部变量,则在方法上声明<T>
class Generic {
<T> void swapFirstAndSecond(List<T> list) {
T first = list.get(0), second = list.get(1);
list.set(1, first);
list.set(0, second);
}
}
情况3:
如果多个字段和方法使用相同的类型T
,但是T
的确切类型并不重要,则进行{{ 1}}在课堂上
<T>
情况4:
如果class Generic<T> {
List<T> list;
void set(List<T> list) {
this.list = list;
}
T getFirst() {
return list.get(0);
}
}
必须是特定类型,例如T
,则不要声明类型参数String
<T>