2

我已经阅读了一些通用限制

当谈到强制转换时,它说我们不能将强制转换与参数化类型一起使用

谁能解释在什么情况下我们可以将 Object 数据类型转换为其子类,因为泛型在必要时会自动执行转换?

假设我有以下代码:

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

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

4

1 回答 1

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] = "";

例如on aNumber[]将导致在ArrayStoreException运行时。

它不是完全(动态)类型安全的,因为T可能是一个类似的类型List<String>,你仍然可以将 aList<Number>放入List[]没有 a 的ArrayStoreException.

于 2012-08-30T21:05:06.680 回答