Java泛型类强制转换异常在外部引发

Java泛型类强制转换异常在外部引发,java,generics,Java,Generics,当我执行这个命令时,我在第9行得到一个ClassCastException。我想知道为什么会有例外。根据我对泛型的理解,我希望类型推断会导致在try-catch中抛出异常 这是使用1.7编译的 public class MyClass { private static Map<String, Object> map = new HashMap<>(); public static void main(String args[]) { ma

当我执行这个命令时,我在第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;
        }
    }
}
公共类MyClass{
private static Map=new HashMap();
公共静态void main(字符串参数[]){
map.put(“key”,Integer.valueOf(1));
浮点数c=方法(“键”);
}
公共静态T方法(字符串k){
试一试{
返回(T)map.get(k);
}捕获(ClassCastException例外){
系统输出打印项数(ex);
返回null;
}
}
}
有没有办法让异常在方法中抛出?我看到了下面的用法,但在调用时无法访问Float.class

method(Float.class, "key")

public static <T> T method(Class<T> clazz, String k) {
    try {
        return clazz.cast(map.get(k));
...
方法(Float.class,“key”)
公共静态T方法(类clazz,字符串k){
试一试{
返回clazz.cast(map.get(k));
...
这是因为

实际上,擦除后的代码将如下所示:

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:看来您必须使用反射来检查返回对象的实际类型。

这是因为

实际上,擦除后的代码将如下所示:

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:似乎您必须使用反射来检查返回对象的实际类型。

您无权访问Float.class是什么意思?您已经将
c
定义为Float类型。在我的实现中,它将是tc=method(“key”)其中T是确定的,有很多方法调用。那么为什么不从顶部调用传递
对象,在那里您实际上需要一个具体的类型?这是我想要避免的事情。也许您可以将
放在顶级调用的线程本地中,并将其放在
方法中
?您没有acc是什么意思ess到Float.class?您已经将
c
定义为Float类型。在我的实现中,它将是tc=method(“key”)其中T是确定的,有很多方法调用。那么为什么不从顶部调用传递
对象,在那里您实际上需要一个具体的类型?这是我想要避免的。也许您可以将
放在线程本地的顶层调用中,并将其放在
方法中
?在这种情况下,擦除是如何工作的?我以为
return(T)map.get(k)
会被类型擦除为
return(Float)map.get(k)
因为它可以从返回值推断。这个答案包含一篇相当不错的文章的链接:有一个保留类型信息的解决方法。不确定它是否适合您的情况,请查看。答案本身很好地解释了擦除。在这种情况下擦除是如何工作的?我想
return(T)map.get(k)
将被类型擦除到
返回(Float)映射。get(k)
,因为它可以从返回值推断。此答案包含指向一篇非常好的文章的链接:有一个保留类型信息的解决方法。不确定它是否适合您的情况,请查看。答案本身对擦除进行了很好的解释。