我已阅读一些通用限制
在谈到铸造时,它说我们不能使用带参数化类型的演员
任何人都可以解释在什么情况下我们可以将Object数据类型转换为它的子类,因为generic会在必要时自动执行转换?
假设我有以下代码:
T[] arrayVar =(T[]) new Object[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
。