我还是Java和Eclipse的新手。我应该通过一个通用类在列表中找到最便宜的商品,并打印出它的参数。我有这个:

public class Store<T extends Item>{

public List<T> items = new ArrayList<T>();

 public void addItem(T it){
         items.add(it);
 }

public T cheapestItem(){
        T cheapest;

        Collections.sort(items, (i1, i2) -> i1.getPrice().compareTo(i2.getPrice()));

        cheapest = Collections.min(items,null);

        return cheapest;

}


}


在我的主要活动中:

Store<Item> store = new Store<>();

for (int i = 0; i < items.size(); i++) {
            store.addItem(items.get(i).getA());
            store.addItem(items.get(i).getB());
}

System.out.println("Cheapest item price is " + store.cheapestItem().getPrice());


我收到一条错误消息:

Exception in thread "main" java.lang.ClassCastException:  com.java.school.B cannot be cast to java.lang.Comparable
at java.util.Collections.min(Unknown Source)
at java.util.Collections.min(Unknown Source)
at com.java.school.Store.cheapestItem(Store.java:20)
at com.java.school.Main.main(Main.java:313)


不幸的是,我不确定自己在做什么错,因为Eclipse并未在运行时指出它。有人可以指出我正确的方向吗?还有另一种方法可以做到这一点吗?

最佳答案

最好的解决方案是在min方法中使用比较器,而不要使用null。这样就可以得到所需的结果-如果比较器不知道如何比较各项,则比较器将无法获得最小值!您可以删除调用以进行排序,并将比较器添加到对min的调用中。它看起来像这样:

public T cheapestItem(){
    return Collections.min(items, (i1, i2) -> i1.getPrice().compareTo(i2.getPrice()));
}


如果返回的是最贵的而不是最便宜的,只需将比较的顺序从t1.compareTo(t2)更改为t2.compareTo(t1)

10-08 16:11