java - 强制转换通用数组的问题

标签 java arrays generics

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

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 填充它。

编辑:这是添加方法和类的相关部分:

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

最佳答案

你可以尝试类似的方法

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

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

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

关于java - 强制转换通用数组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17928433/

相关文章:

Java类类型

java - <url-pattern>/</url-pattern> 供过滤器使用

java - Play框架在保存之前检索同一对象的旧记录

c++ - 数组与 std::initializer_list 作为函数参数

java - 类型删除和重写泛型方法

generics - 如果我为 B 实现 From<A>,是否也会为 Vec<B> 实现 From<Vec<A>>?

java - 如何使用 Dozer bean Mapper 转换 URL 字段?

java - 如何通过 alpha beta 剪枝实现迭代加深

c - 如何将二维数组传递给 C 程序?

c - 在 C 中从函数返回数组到 main?