2

我阅读了之前发现的每篇文章都在问这个问题,但没有一个可以适用于我为这项任务所做的工作。首先,我必须使用一个数组。其次,包含泛型数组的类正在被其他类访问和使用。所以虽然我可以编译类似的东西:

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);
      }
 }
4

3 回答 3

1

你可以尝试类似的东西

 T[] store = (T[]) Array.newInstance(Comparable.class, size);

为您的后备数组而不是使用Object数组。这不会产生ClassCastException你正在经历的。据我所知,它也不应该产生任何ArrayStoreException东西(至少我在我的小测试中没有得到任何东西)。

当然,创建一个 的数组会更好T,但唯一的方法是获取对Class<T>(可能通过构造函数参数)的引用并在Array.newInstance(...).

于 2013-07-29T16:18:40.933 回答
1

您必须在 Driver 类上实现 Comparable。

public class Driver implements Comparable<Driver>

并将其用于初始化数组。

T[] arr = (T[]) new Comparable[15];
于 2013-07-29T17:13:17.510 回答
0

这段代码与数组的转换结果相同:

@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;
}

您显然需要小心,因为很容易获得 ajava.lang.ClassCastException但即使您可以直接转换原始数组,您也会期望。

于 2013-07-29T16:25:20.243 回答