通用和强制转换java规则

时间:2012-08-30 20:55:20

标签: java generics

我已阅读一些通用限制

在谈到铸造时,它说我们不能使用带参数化类型的演员

任何人都可以解释在什么情况下我们可以将Object数据类型转换为它的子类,因为generic会在必要时自动执行转换?

假设我有以下代码:

T[] arrayVar =(T[]) new Object[1] //它会导致编译器警告,但仍然可以

为什么我应该在这种情况下使用演员?不是说在通用中,演员表会自动完成吗?

1 个答案:

答案 0 :(得分: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