1

假设我有以下代码

E[] arrayVar = (E[])new Object[1];// It causes a compiler warning 

问题是,在什么情况下代码会导致运行时错误,

4

3 回答 3

4

如果您尝试将结果分配给 reified 类型,则该代码只会导致运行时错误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.

于 2012-08-31T02:07:54.927 回答
1

展开 LastStar007's Answer

该语句的问题在于 java 直到运行时才能确定对象 E 的类型。同样不幸的是,java 没有提供一种简单的方法来确定指定对象的类型(getClass() 不适用于此)。

您最好的选择(如果是数字数据)是检查每个助记符的最大值或字符数据,检查每个字符的存储大小。是的,这听起来很乏味,但是 java 没有类型信息,比如 C++,这会让事情变得更容易

于 2012-08-31T01:27:37.157 回答
-2

它永远不会导致运行时错误,因为它总是会导致编译时错误。AnObject不能向下转换为E,因此 anObject[]不能向下转换为E[]。除此之外,您无法创建类型数组,因为该类在编译时E不知道类型是什么。E

于 2012-08-31T01:23:36.920 回答