【问题标题】:java.lang.ClassCastException: com.MyComp.model.Image cannot be cast to java.lang.Comparablejava.lang.ClassCastException:com.MyComp.model.Image 无法转换为 java.lang.Comparable
【发布时间】:2014-08-17 11:43:22
【问题描述】:

我尝试使用以下代码对列表进行排序:

        List<Image> sortedImages = new LinkedList<Image>(inputImages);
        Collections.sort(sortedImages, imageScoreComparator);

class ImageScoreComparator implements Comparator<Image> {

    ImageScoreCalculator imageScoreCalculator;

    ImageScoreComparator() {
        this(new ImageScoreCalculator(Calendar.getInstance()));
    }

    @VisibleForTesting
    ImageScoreComparator(ImageScoreCalculator imageScoreCalculator) {
        this.imageScoreCalculator = imageScoreCalculator;
    }

    @Override
    public int compare(Image image1, Image image2) {
        if (image2.isPromoted() && !image1.isPromoted()) {
            return 1;
        } else if (image1.isPromoted() && !image2.isPromoted()) {
            return -1;
        } else {
            return Double.compare(imageScoreCalculator.getScoreForImage(image1), imageScoreCalculator.getScoreForImage(image2));
        }
    }
}

但我收到此错误:

java.lang.ClassCastException: com.MyComp.model.Image cannot be cast to java.lang.Comparable

这就是我初始化imageScoreComparator的方式

imageScoreComparator = mock(ImageScoreComparator.class);
        when(imageScoreComparator.compare(image1, image2)).thenReturn(0);

【问题讨论】:

  • 发布完整的堆栈跟踪。

标签: java sorting collections guava


【解决方案1】:

听起来您的 imageScoreComparator 变量为空。如果作为第二个参数传递给Collections.sortComparator 为空,它不会将其视为错误;相反,它会尝试将列表中的每个项目强制转换为Comparable,根据它们的自然排序顺序对它们进行排序,这对这些对象不起作用。

确保将 imageScoreComparator 变量初始化为非空值。

【讨论】:

  • 天哪。我不知道。接受空比较器是多么愚蠢的设计决定! +1。
  • @user1065869 我的答案是一样的:确保将 Comparator 变量设置为非空值(在使用之前)。
  • 是在模拟不创建实例吗?
  • @user1065869 我不知道。显然不是。
猜你喜欢
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
相关资源
最近更新 更多