Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型转换,非直接_Java_Generics_Casting_Classcastexception - Fatal编程技术网

Java泛型转换,非直接

Java泛型转换,非直接,java,generics,casting,classcastexception,Java,Generics,Casting,Classcastexception,我发现Java中的强制转换有些奇怪,我以前从未见过。 实际上,在使用通用方法编程的情况下,不会执行强制转换 测试这个奇怪的东西 在HashMap上: HashMap<String,Object> map = ... map.put("hello", "World"); System.err.println((Integer)map.get("hello")); // -----> ClassCastException 方法守则: private <T> T ge

我发现Java中的强制转换有些奇怪,我以前从未见过。 实际上,在使用通用方法编程的情况下,不会执行强制转换

测试这个奇怪的东西

在HashMap上:

HashMap<String,Object> map = ...
map.put("hello", "World");
System.err.println((Integer)map.get("hello")); //  -----> ClassCastException
方法守则:

private <T> T get(String key, Class<T> c){
    return (T)map.get(key);
}

private Object get(String key){
    return map.get(key);
}
private T get(字符串键,c类){
return(T)map.get(key);
}
私有对象获取(字符串键){
返回map.get(key);
}
有人知道mechansim有没有名字或者知道什么吗


谢谢

类型参数在编译时会被删除。因此,像
(T)
这样的强制转换将成为可执行文件中的
(Object)
,因此您将获得第一个行为

类型参数仅用于执行编译时键入和类型检查

但是,在第二行,我认为编译器生成了对
Integer.toString()
方法的调用,因此需要强制转换,因此出现了异常

请参阅:在Java教程中。

演员阵容:

(T) map.get(key);
由于类型擦除,根本不做任何事情。方法
MapWrap.get()
将被擦除为:

private Object get(String key, Class<T> c){
    return map.get(key);
}
我称之为:“Java中的模板是一种痛苦”;-)

该行:

System.err.println(wrap.get("hello",Integer.class));
正在使用println(objectobj)方法,因此没有类型问题,因为实际上没有人检查wrap.get的返回对象的类型

在第二种情况下:

System.err.println(wrap.get("hello", Integer.class).toString());
调用的是整数的toString(),您的类强制转换异常就是这样


不幸的是,克里斯指向java是从模板中删除类型,但是记住在方法(也许)

中仍然存在,你也可以称这个“java泛型没有C++模板”;说真的,最好不要用C++术语来思考泛型。我知道,但一旦你尝试做一些超出基本要求的事情,你就会感到非常痛苦。。最重要的是,我们缺乏对基本类型(int、float)的支持。非常适合perfs@icCube实际上,Java的泛型对于它们应该启用的功能有些过度设计。这使得现有的集合API和类似的用例类型安全。而且,由于Java的集合在泛型出现之前无法有效地处理基元类型,因此不会损失任何性能。(使用类型擦除,也无法使它们有效地处理..NET选择使用物化而不是类型擦除,但成本是必须创建一个新的集合API,而且许多旧API(如大多数ASP.NET)没有也不能更新为使用泛型。)例如,您打算为每种基本类型实现二进制搜索算法还是其他算法?这就是我们目前正在做的。。是的,有时我们希望vm创建新代码(是的,类似于旧的宏)。Java有很多很棒的想法,但他们太固执了,看起来从不认真对待数学和科学领域的问题。
System.err.println(wrap.get("hello",Integer.class));
System.err.println(wrap.get("hello", Integer.class).toString());