我已经阅读了一些通用限制
当谈到强制转换时,它说我们不能将强制转换与参数化类型一起使用
谁能解释在什么情况下我们可以将 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] = "";
例如on aNumber[]
将导致在ArrayStoreException
运行时。
它不是完全(动态)类型安全的,因为T
可能是一个类似的类型List<String>
,你仍然可以将 aList<Number>
放入List[]
没有 a 的ArrayStoreException
.