如何在java中创建通用对象的数组

时间:2015-01-11 11:03:52

标签: java arrays exception generics

在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];
}

2 个答案:

答案 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来做你想要的。这似乎是与泛型更兼容的方法。