Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 铸造泛型数组的问题_Java_Arrays_Generics - Fatal编程技术网

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];