[英]Generic and casting java rules
我已经阅读了一些通用限制
说到类型转换,它说我们不能对参数化类型使用类型转换
谁能解释在什么情况下我们可以将Object数据类型强制转换为其子类,因为在必要时泛型会自动执行强制转换?
假设我有以下代码:
T[] arrayVar =(T[]) new Object[1]
//会引发编译器警告,但仍然可以
在这种情况下为什么要使用演员表? 它不是说泛型转换将自动完成吗?
假设T
未定义为<T extends NotObject>
,则
T[] arrayVar =(T[]) new Object[1]// it causes a compiler warning but still okay
擦除后为
Object[] arrayVar = (Object[]) new Object[1];
具有多余的未经检查的演员表。
这不是类型安全的。
考虑当你做的时候会发生什么
f(arrayVar)
哪里
void f(Object[] out) { out[0] = "A string"; }
如果在String
不是T
的子类时发生这种情况,则说明您存在类型安全冲突。
要解决此问题,您可以尝试创建更特定类型的数组。 如果可以采用类型的参数
Class<T> clazz
然后您可以创建数组
T[] varArray = (T[]) Array.newInstance(clazz, 1);
这是更类型安全的,因为尝试这样做
out[0] = "";
例如,对Number[]
进行操作将在运行时导致ArrayStoreException
。
它不是完全(动态)类型安全的,因为T
可能是类似List<String>
的类型,并且您仍然可以将List<Number>
放入List[]
而无需使用ArrayStoreException
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.