Java 铸造泛型数组的问题
我读了以前的每一篇文章,我发现有人问这个问题,但没有一篇文章我能适用于我为这项任务所做的工作。首先,我必须使用数组。其次,包含泛型数组的类正在被其他类访问和使用。因此,虽然我可以编译如下内容:Java 铸造泛型数组的问题,java,arrays,generics,Java,Arrays,Generics,我读了以前的每一篇文章,我发现有人问这个问题,但没有一篇文章我能适用于我为这项任务所做的工作。首先,我必须使用数组。其次,包含泛型数组的类正在被其他类访问和使用。因此,虽然我可以编译如下内容: T[] arr = (T[]) new Object[15]; 当我尝试运行使用此数据结构的任何其他类时,我会得到一个错误,即它们无法强制转换 Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; can
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;
项作为参数传递给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;
}
}
公共类athreaedbstree您可以尝试以下操作
T[] store = (T[]) Array.newInstance(Comparable.class, size);
用于备份数组,而不是使用对象
数组。这不会产生您正在经历的ClassCastException
。据我所知,它也不应该产生任何ArrayStoreException
(至少我在小测试中没有得到任何异常)
当然,创建一个T
数组会更好,但唯一的方法是获取对Class
的引用(可能通过构造函数参数),并在数组中使用该引用。newInstance(…)
此代码实现了与数组类型转换相同的结果:
@SuppressWarnings({"unchecked"})
public <T> T[] cast(Object[] array, Class<T> type)
{
T[] castArray = (T[])Array.newInstance(type, array.length);
for (int i = 0; i < array.length; i++)
{
castArray[i] = (T)array[i];
}
return castArray;
}
@SuppressWarnings({“unchecked”})
公共T[]强制转换(对象[]数组,类类型)
{
T[]castArray=(T[])Array.newInstance(类型,Array.length);
for(int i=0;i
显然,您需要小心,因为很容易获得java.lang.ClassCastException
,但即使您可以直接转换原始数组,您也会期望这样做。您必须在驱动程序类上实现可比性
public class Driver implements Comparable<Driver>
请发布使用它的方法请发布完整的泛型方法、您调用它的方式,以及用于获取此类异常的示例数据。换句话说,一个:)“不要使用Object[]
,而是T[]
”-这会从哪里开始造成伤害。向我们展示这个点,可能会出现一些解决方案,比如前面提到的数组和数组。对不起。添加了一些代码,如果有更多,请告诉我。真的很沮丧,因为我认为我已经完成了这项任务,现在我无法完成最简单的最后一部分。真的,最简单的方法是使用ArrayList,它为您进行必要的转换。尝试此操作时,我出现了一个错误。错误:找不到符号存储=(T[])数组。newInstance(Comparable.class,12);^symbol:variable ArrayDid是否正确导入数组
类?它位于java.lang.reflect.Array
。我以为我有,但我想没有。谢谢。正如查姆利·伊德努利指出的,你可以使用T[]store=(T[])新的可比[size]代码>。这可能是个更好的主意。将Array.newInstance()
与类文本一起使用是没有意义的。只需使用新的可比[尺寸]
public class Driver implements Comparable<Driver>
T[] arr = (T[]) new Comparable[15];