【问题标题】:Java generic class extending comparable cannot be cast to java.base/[Ljava.lang.Comparable扩展可比较的 Java 泛型类不能转换为 java.base/[Ljava.lang.Comparable
【发布时间】:2018-06-26 15:54:01
【问题描述】:

我正在尝试将 Object[] 数组转换为泛型排序 这部分代码我已经实现了

public class SortedArraySet<T extends Comparable<T>> implements Set<T>, Comparator<T> {

    T[] arr;
    int size = 5, index = 0;

    @SuppressWarnings("unchecked")
    SortedArraySet() {
        arr = (T[]) new Object[5];
        System.out.println("New set was initiated");
    }

    @Override
    public int compare(T a, T b) {

        if (a.compareTo(b) > 0)
            return 1;
        else

            return 0;
    }

当我运行它时,我得到以下编译错误

线程“主”java.lang.ClassCastException 中的异常: java.base/[Ljava.lang.Object;不能转换为 java.base/[Ljava.lang.Comparable;在 q3.SortedArraySet.(SortedArraySet.java:12) 在 q3.q3main.main(q3main.java:6)

第6行说明如下

SortedArraySet<Integer> sa = new SortedArraySet<Integer>();

在我添加extend Comparable(以及compareTo)以对集合进行排序之前,该代码可以正常工作

是否可以使用 Collections.sort?我已经尝试过,但它似乎不适用于这样的数组!

【问题讨论】:

  • 旁注:你知道TreeSets,对吧?
  • 这是 100% 运行时。当您声明这些转换时,编译器会信任您。
  • 是的,我知道所有其他数据结构,但我只能使用数组:| ,我会在 10 分钟内用 LinkedList 解决这个问题,这里的重点是实现一个通用数组排序集

标签: java arrays casting


【解决方案1】:

你需要使用:

arr = (T[]) new Comparable[5];

代替

arr = (T[]) new Object[5];

因为类型擦除后T[] arr 将是Comparable[] arr.所以

T[] arr = (T[]) new Object[5]; 

会变成

Comparable[] arr = (Comparable[]) new Object[5];

显然,它会抛出java.lang.ClassCastException

【讨论】:

  • 你能解释一下为什么我必须使用可比较的,因为它也是扩展对象
  • @Athl1n3 如果它解决了您当前的问题。然后你应该接受它并发布一个新问题,因为过多的编辑可能会误导问题和答案。我的建议将是发布一个带有新问题的新问题。我想帮你。
  • @Athl1n3 因为你不能写像 Comparable[] arr = (Comparable[]) new Object[5]; 这样的代码。它会给你同样的 excpetion。
  • 谢谢,我很感激,我已经解决了前面提到的问题
猜你喜欢
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多