Moh*_*s A 9 java generics casting
我当时正在教学生老式的泛型,却遇到了看不见的东西!演示时的行为!:(
我有一堂简单的课
public class ObjectUtility {
public static void main(String[] args) {
System.out.println(castToType(10,new HashMap<Integer,Integer>()));
}
private static <V,T> T castToType(V value, T type){
return (T) value;
}
}
Run Code Online (Sandbox Code Playgroud)
输出为10,没有任何错误!!!我原以为这会给我ClassCastException,但有些错误,例如Integer无法转换为HashMap。
好奇与愤怒,我尝试getClass()了返回值,如下所示
System.out.println(castToType(10,new HashMap<Integer,Integer>()).getClass());
Run Code Online (Sandbox Code Playgroud)
如我所料,它抛出ClassCastException。
另外,当我将同一条语句分为两部分时,类似
Object o = castToType(10,new HashMap<Integer,Integer>());
System.out.println(o.getClass());
Run Code Online (Sandbox Code Playgroud)
它不会引发任何错误并打印 class java.lang.Integer
全部执行
openjdk version "1.7.0_181"
OpenJDK Runtime Environment (Zulu 7.23.0.1-macosx) (build 1.7.0_181-b01)
OpenJDK 64-Bit Server VM (Zulu 7.23.0.1-macosx) (build 24.181-b01, mixed mode)
Run Code Online (Sandbox Code Playgroud)
有人可以为我指出正确原因的正确方向吗?
T在运行时不存在。解析为约束的下限。在这种情况下,没有任何内容,因此解析为Object。一切都可以转换为Object,因此没有类转换异常。
如果您要更改此约束
private static <V,T extends Map<?,?>> T castToType(V value, T type){
return (T) value;
}
Run Code Online (Sandbox Code Playgroud)
然后T将转换为下界Map,显然Integer不是,并且得到了您所期望的类转换异常。
另外,当我将同一条语句分为两部分时,类似
Run Code Online (Sandbox Code Playgroud)Object o = castToType(10,new HashMap<Integer,Integer>()); System.out.println(o.getClass());它没有抛出任何错误
castToType(10,new HashMap<Integer,Integer>()).getClass()
Run Code Online (Sandbox Code Playgroud)
这会引发类强制转换异常,因为它会静态链接到方法HashMap::getClass(不是 Object::getClass),因为签名表示希望将其HashMap作为返回值。这需要进行隐式转换HashMap,该转换失败,因为在运行时castToType返回a Integer。
第一次使用时
Object o = castToType(10,new HashMap<Integer,Integer>());
Run Code Online (Sandbox Code Playgroud)
现在Object::getClass,无论实际返回什么内容,您都可以静态链接到哪个链接。
“未拆分”版本与此等效
final HashMap<Integer, Integer> map = castToType(10, new HashMap<>());
System.out.println(map.getClass());
Run Code Online (Sandbox Code Playgroud)
希望能证明差异
| 归档时间: |
|
| 查看次数: |
300 次 |
| 最近记录: |