gpt4 book ai didi

java - Java中的泛型数组

转载 作者:IT老高 更新时间:2023-10-28 20:39:38 25 4
gpt4 key购买 nike

好的,我一直在网上搜索,但似乎找不到任何解决问题的方法。我找到了很多解决方案,但没有一个适合。

我需要创建一个泛型数组。但是泛型类型本身扩展了 Comparable。当我尝试以下操作时:

public class Hash<T extends Comparable<String>> {
private T[] hashTable;
private int tableSize;

Hash(int records, double load) {
tableSize = (int)(records / loadFactor);
tableSize = findNextPrime(tableSize);
hashTable = (T[])(new Object[tableSize]); //Error: Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;
}
}

问题在于不能将 Object 转换为扩展 Comparable 的泛型。有没有办法解决这个问题?

最佳答案

泛型和数组基本上不能混用。简短的回答是您可以解决此问题。更长的答案是您可能不应该这样做,我会解释原因。

您可以使用 Array.newInstance()像这样:

private Comparable[] hashtable;

...

hashtable = (Comparable[])Array.newInstance(Comparable.class, tableSize);

但您不能创建参数化类型的数组。

数组是协变的。这意味着它们在运行时保留其元素的类型。 Java 的泛型不是。他们使用 type erasure 基本上掩盖了正在进行的隐式转换。理解这一点很重要。

因此,当您创建 Object 数组时,您不能将其转换为 Comparable 数组(或任何其他类型),因为这是不正确的。

给你一个例子。对于泛型,这是完全合法的:

List<String> list = new ArrayList<String>();
List<Integer> list2 = (List<Integer>)list;
list.add(3);

这也是你不能这样做的原因:

public <T> T newInstance(T t) {
return new T(); // error!
}

即在运行时不知道 T 的类。这就是为什么上面的代码更常写成:

public <T> T newInstance(T t, Class<T> clazz) {
return clazz.newInstance();
}

因为它们不是泛型参数的运行时类型。但是对于数组:

String arr[] = new String[10];
Integer arr2[] = (Integer[])arr; // error!

在这种情况下(恕我直言)你应该做的不是使用数组,而是使用 ArrayList。老实说,几乎没有理由在 ArrayList 上使用数组,泛型只是其中的一个例子。

如需更好更完整的解释,请参阅(优秀)Java Generics FAQ :

Can I create an array whose component type is a concrete parameterized type?

No, because it is not type-safe.

Arrays are covariant, which means that an array of supertype references is a supertype of an array of subtype references. That is, Object[] is a supertype of String[] and a string array can be accessed through a reference variable of type Object[].

...

关于java - Java中的泛型数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1817524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com