在java中,我想创建一个BST类的数组,巫婆是一个通用对象。我写的时候
box = new BST<T>[n];
它一直告诉我[无法创建BST的通用数组],所以我使用了
box = (BST<T>[]) new Object[n];
错误消失但是当我运行它时我得到ClassCastException
这是整个实现
public class hash<T> {
private BST<T> box[];
private int size;
@SuppressWarnings("unchecked")
public hash(int n){
size = n;
box = (BST<T>[]) new Object[n];
}
答案 0 :(得分:2)
您可以通过编写
来消除运行时异常box = (BST<T>[]) new BST[n];
有充分理由说明你不应该这样做。数组和泛型不能很好地混合。数组在运行时检查其类型信息。例如,String[]
知道它是String
的数组并严格维护它。如果您将String[]
转换为Object[]
并尝试添加Integer
,则会在运行时获得ArrayStoreException
。另一方面,泛型是使用类型擦除实现的,这意味着类型信息存在于编译时但不存在于运行时。如果您将ArrayList<String>
转换为原始ArrayList
,然后添加Integer
,则根本不会出现任何异常。
我建议改为使用List<BST<T>>
。
答案 1 :(得分:1)
有充分理由说明为什么要努力做你想做的事。基本上他们归结为这样一个事实,即你想做的事情不会是类型安全的。如果您设法创建了BST<T>[]
类型的数组,那么它将是一个数组,其成员可以有不同的类型(例如BST<Integer>
和BST<Float>
)。
您可以使用对象数组,然后检查成员的实例类型(使用instanceof)并在程序中使用它时将其强制转换,但这有效地解决了Java的强类型问题,我不会建议除非在您的情况下绝对不可避免。编码方法与this answer中描述的第二个选项类似(尽管不完全相同),我建议你看一下。
Oracle restrictions on generic types中讨论了这个问题。在here(和here)上也有类似的问题,尽管它们并不完全重复,因为它们往往会询问使用泛型类型<T>
作为数组的类型。
我建议你使用ArrayList来做你想要的。这似乎是与泛型更兼容的方法。