假设我有以下代码
E[] arrayVar = (E[])new Object[1];// It causes a compiler warning
问题是,在什么情况下代码会导致运行时错误,
答案 0 :(得分:4)
如果您尝试将结果分配给E
的具体类型,那么该代码只会导致运行时错误:
createArray(); // no exception
String[] arr = createArray(); // causes ClassCastException
public static <E> E[] createArray() {
return (E[]) new Object[1];
}
创建通用数组的安全方法是使用Array.newInstance
:
public static <E> E[] createArray(Class<E> component) {
return (E[]) Array.newInstance(component, 1);
}
此方法不会导致ClassCastException
。
答案 1 :(得分:1)
扩展LastStar007的答案
该语句的问题在于java直到运行时才能确定对象E的类型。还不幸的是,java没有提供一种确定指定对象类型的简单方法(getClass()不适用于此)。
您最好的选择(如果是数字数据)将检查每个助记符或字符数据的最大值,检查每个字符的存储大小。是的,这听起来很乏味,但java没有typeinfo,比如C ++会让事情变得更容易
答案 2 :(得分:-2)
它永远不会导致运行时错误,因为它总是会导致编译时错误。 Object
无法转发为E
,因此无法将Object[]
转发为E[]
。除此之外,您无法创建类型为E
的数组,因为类在编译时不知道E
的类型是什么。