- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
好的,我一直在网上搜索,但似乎找不到任何解决问题的方法。我找到了很多解决方案,但没有一个适合。
我需要创建一个泛型数组。但是泛型类型本身扩展了 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 ofString[]
and a string array can be accessed through a reference variable of typeObject[]
....
关于java - Java中的泛型数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1817524/
我是一名优秀的程序员,十分优秀!