当我执行此操作时,我在第9行得到一个ClassCastException。我想知道为什么会发生异常。根据我对泛型的理解,我希望类型推断会导致在try catch中抛出异常。
这是使用1.7编译的。
public class MyClass {
private static Map<String, Object> map = new HashMap<>();
public static void main(String args[]) {
map.put("key", Integer.valueOf(1));
Float c = method("key");
}
public static <T> T method(String k) {
try {
return (T) map.get(k);
} catch (ClassCastException ex) {
System.out.println(ex);
return null;
}
}
}
有没有办法在方法中抛出异常?我已经看到了下面的用法,但我在通话时无法访问Float.class。
method(Float.class, "key")
public static <T> T method(Class<T> clazz, String k) {
try {
return clazz.cast(map.get(k));
...
答案 0 :(得分:4)
这是因为type erasure
实际上,删除后的代码将显示为:
public static void main(String args[]) {
map.put("key", Integer.valueOf(1));
Float c = (Float) method("key");
}
public static Object method(String k) {
try {
return map.get(k);
} catch (ClassCastException ex) {
System.out.println(ex);
return null;
}
}
这就是为什么你在一条你不期望的行中得到例外的原因。
UPD:您似乎必须使用反射来检查返回对象的实际类型。