好的,我一直在Google搜索网络,但似乎找不到解决我问题的任何方法。我找到了很多解决方案,但都不合适。
我需要创建一个泛型数组。但是泛型类型本身扩展了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;
}
}
问题在于对象不能转换为扩展Comparable的泛型。有没有解决的办法?
泛型和数组基本上不混合。简短的答案是你可以解决此问题。较长的答案是你可能不应该这样做,我将解释原因。
你可以这样使用Array.newInstance()
:
private Comparable[] hashtable;
...
hashtable = (Comparable[])Array.newInstance(Comparable.class, tableSize);
但你无法创建参数化类型的数组。
数组是协变的。这意味着它们在运行时保留其元素的类型。Java的泛型不是。他们使用类型擦除基本上掩盖了正在进行的隐式转换。了解这一点很重要。
因此,当你创建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!
在这种情况下(imho),你应该执行的操作不是使用数组,而是使用ArrayList
。老实说,在an上使用数组的理由很少,ArrayList
而泛型只是其中的一个例子。
有关更好和更完整的解释,请参阅(优秀)Java Generics FAQ:
我可以创建一个组件类型为具体参数化类型的数组吗?
不可以,因为它不是类型安全的。
数组是协变的,这意味着超类型引用的数组是子类型引用的数组的超类型。也就是说,Object[]
是的超类型,String[]
可以通过type的引用变量访问字符串数组Object[]
。
…
问题内容: 我正在尝试在java中创建一个通用数组-在其中我遇到了一些问题-我如何制作一个大小为6且里面有一个byte []和一个Integer的元组数组? 谢谢 问题答案: 好吧,您可以使用原始类型: 或者,您可以进行未经检查的转换: 或者,您也可以使用列表: 我建议改用列表。 在前两个选项之间进行选择,我建议您选择未经检查的转换,因为它将为您提供编译时检查。但是,如果将其他类型的元组放入其中,
问题内容: 该代码似乎不起作用,它将抛出异常: java.lang.ClassCastException:[Ljava.lang.Object; 无法转换为… 有人可以告诉我如何创建具有通用类型的数组吗?谢谢。 问题答案: 您不能:必须将类作为参数传递:
问题内容: 由于Java泛型的实现,因此不能有以下代码: 如何在保持类型安全的同时实现此目的? 我在Java论坛上看到了这样的解决方案: 但是我真的不知道发生了什么。 问题答案: 我不得不问一个问题:您的GenSet“已选中”还是“未选中”?那是什么意思? 检查:强打字。GenSet明确地知道什么类型的包含对象(即它的构造是明确要求有Class 参数,当他们通过了类型不是参数的方法会抛出异常E。见
问题内容: 我有TreeNode的通用类: 当我尝试做时: 我出错了。但是“ new TreeNode [num_of_children]”有效。我读了有关类型擦除的文章,但我不明白为什么它不起作用。这是为什么?请赐教! 问题答案: 之类的东西,并通过Java是不允许的。您唯一可以做的就是和(无界通配符参数)。 这样做的原因有些复杂,但很有启发性。Java中的数组在运行时知道它们的组件类型,并且每
问题内容: 我最近开始学习JAVA泛型。一切都说得通,我现在有点理解。但是有一件事让我烦恼-您无法创建通用类型的数组。 我想实现诸如队列和堆栈之类的抽象数据类型,但是要使用某种通用类型作为存储在堆栈中的基础数据。我将如何解决?我确定我想念但那是什么? 提前致谢。 问题答案: 《有效的Java》,第5章,GENERICS,第25项:首选列表而不是数组 : 数组在两个重要方面不同于通用类型。首先,数组
问题内容: 我下面有返回通用数组的通用方法: 但是稍后,当我尝试使用以下方法获取结果数组时: 对于情况1,我总是在运行时出错: 谁能解释为什么以及如何正确返回通用数组?谢谢。 以下是我的理解,如果我写错了,请纠正我。 正如Tim所提到的,类型擦除是在编译时发生的,因此在字节码中,每个T对象只是Object类型,同时,编译器将“适当地”将Object的类型强制转换为T。 假设T是一个整数,其中T被声