【发布时间】:2016-08-18 11:57:05
【问题描述】:
您好,我在 java 中使用泛型类型时遇到问题。实际问题是,当我在方法声明上使用泛型类型时工作正常。然后,如果我将泛型类型添加到接口声明中,则代码不会编译。以下是工作代码:
public interface IRuntimeConvert {
public <T> T convertInstanceOfObject(String o, Class<T> clazz);
}
public class RuntimeConvertImpl implements IRuntimeConvert {
private final Map<String, Object> hashMap;
public RuntimeConvertImpl(Map<String, Object> hashMap) {
this.hashMap = hashMap;
}
@Override
public <T> T convertInstanceOfObject(String o, Class<T> clazz) {
try {
return clazz.cast(hashMap.get(o));
} catch (ClassCastException e) {
return null;
}
}
}
public static void main(String[] args) {
Map<String, Object> hashMap = new HashMap<>();
hashMap.put("s", "string");
hashMap.put("i", 0);
hashMap.put("l", 0L);
IRuntimeConvert rtConvert = new RuntimeConvertImpl(hashMap);
String s = rtConvert.convertInstanceOfObject("s", String.class);
System.out.println(s);
Integer i = rtConvert.convertInstanceOfObject("i", Integer.class);
System.out.println(i);
Long l = rtConvert.convertInstanceOfObject("l", Long.class);
System.out.println(l);
}
上面的代码正在编译。当我进行以下更改时,代码无法编译。
public interface IRuntimeConvert<S> {
public <T> T convertInstanceOfObject(String o, Class<T> clazz);
public S getSomething(S s);
}
public class RuntimeConvertImpl implements IRuntimeConvert<Object> {
private final Map<String, Object> hashMap;
public RuntimeConvertImpl(Map<String, Object> hashMap) {
this.hashMap = hashMap;
}
@Override
public <T> T convertInstanceOfObject(String o, Class<T> clazz) {
try {
return clazz.cast(hashMap.get(o));
} catch (ClassCastException e) {
return null;
}
}
@Override
public Object getSomething(Object s) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
在主类中进行上述更改后,我为方法 rtConvert.convertInstanceOfObject("s", String.class) 的每次调用都设置了类型转换错误,并带有错误消息:
Incompatible types: Object cannot be converted to String.
如果我尝试运行 main 我得到:线程“main”中的异常 java.lang.RuntimeException:无法编译的源代码 - 不兼容的类型:java.lang.Object 无法转换为 java.lang.String
【问题讨论】:
-
类型擦除。 Java 泛型不像 C++ 模板:docs.oracle.com/javase/tutorial/java/generics/erasure.html
-
您好 cparaskeva - 您能否编辑您的问题以包含更多关于它如何以及在何处不编译的详细信息?
-
如果出现错误,请始终包含错误消息。
-
我在删除 ** 后测试你的代码,创建两个文件 IRuntimeConvert 和 RuntimeConvertImpl。添加并导入到 java.util.Map。它编译得很好。
-
您使用的是什么 java/javac 版本?我刚刚用
javac 1.8.0_92很好地编译了它。 (当然是去掉星星之后)