【发布时间】:2013-07-29 15:46:38
【问题描述】:
我阅读了我发现的每一篇提出这个问题的帖子,但我无法将它们都适用于我为这项任务所做的事情。首先,我必须使用一个数组。其次,包含泛型数组的类正在被其他类访问和使用。所以虽然我可以编译类似的东西:
T[] arr = (T[]) new Object[15];
当我尝试运行使用此数据结构的任何其他类时,我收到无法强制转换的错误。
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; can
not be cast to [Ljava.lang.Comparable;
我阅读的解决方案或变通方法主要是使用 Array.newInstance() 创建类并将其转换为泛型类型 T[]。我遇到的问题是我不知道我会用这个方法使用什么类。没有任何东西传递给我的构造函数。
我最初的解决方法是将数组实例化为字符串并转换为 T[]。这行得通,我的课程被编译,我的小驱动程序完美执行。但是现在我正在编写另一个使用新数据结构的类,然后将其输入到这个数据结构中。当我尝试向数组中添加任何内容时,它会中断。
Exception in thread "main" java.lang.ArrayStoreException: DATATYPE
当我尝试将它添加到原始类中的数组时,错误给了我一行:
store[length] = item;
item 以
的形式传递给 add 方法T item
这里有什么我遗漏的吗?我想我可以将它转换为 T[] 然后用通用项目 T 填充它。
编辑:这是 add 方法和类的相关部分:
public class AThreadedBSTree<T extends Comparable<? super T>> implements
ThreadedBSTreeInterface<T>, Cloneable
{
public void add(T item)
{
ensureCapacity();
store[length] = item;
}
}
这是我用来测试不同数据结构的 add 方法的代码:
public class Driver
{
public static void main(String args[])
{
Scanner in = new Scanner(System.in);
Datatype test = new Datatype(in);
AThreadedBSTree<Datatype> tree = new AThreadedBSTree<Datatype>();
tree.add(test);
}
}
【问题讨论】:
-
请贴出你使用的方法
-
请发布完整的泛型方法、调用方式以及用于获取此类异常的示例数据。换句话说,SSCCE :)
-
“不要使用
Object[],而是使用T[]” - 这会从哪里开始受到伤害。向我们展示那个地方,可能会出现一些解决方案,例如前面提到的 Array 和 Arrays。 -
对不起。添加了一些代码,如果还有更多,请告诉我。真的很沮丧,因为我以为我已经完成了这项任务,现在我无法完成最简单的最后一部分。
-
真的,最简单的方法就是使用 ArrayList
,它会为您完成必要的转换。