【问题标题】:cannot be cast to java.lang.Comparable不能转换为 java.lang.Comparable
【发布时间】:2012-01-02 09:27:59
【问题描述】:
import java.util.HashMap;
import java.io.*;
import java.util.*;
public class Fegan implements Comparable{
HashMap<String, Integer> cart = new HashMap<String, Integer>();
List list = new ArrayList<FoodItems>();
int x =0;
public void addToCart(FoodItems f)
{
    cart.put(f.name, f.valueOfFood);
}
public String display(FoodItems f)
{
    return(f.name + " costs " + f.valueOfFood);
}
public void addToList(FoodItems f)
{
    //FoodItems temp = (FoodItems) f;
    list.add(f);
}
public int compareTo(Object o)
{
    //FoodItems temp = (FoodItems) o;
    if(this.x == ((FoodItems)o).valueOfFood)
        return 0;
    else if (this.x <((FoodItems)o).valueOfFood)
        return 1;
    else 
        return -1;
}
public void sortMap(List list)
{
    for(int i =0; i< list.size(); i++)
    {
        FoodItems temp = (FoodItems) list.get(i);
        cart.put(temp.name, temp.valueOfItem);

    }
}
}

import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.io.*;
import java.util.*;
public class Test {
public static void main(String [] args)
{
    HashMap<String, Integer> cart = new HashMap<String, Integer>();
    FoodItems firts = new FoodItems("Chocolate" , 50);
    FoodItems second = new FoodItems("Juice", 79);
    FoodItems third = new FoodItems("Apple", 200);
    FoodItems forth = new FoodItems("Orange", 300);
    FoodItems fifth = new FoodItems("Milk" , 400);
    ArrayList items = new ArrayList();
    items.add(firts);
    items.add(second);
    items.add(third);
    items.add(forth);
    items.add(fifth);
    Collections.sort(items);
    Iterator itr = items.iterator();
    Fegan myFegan = new Fegan();
    myFegan.sortMap(items);

    while(itr.hasNext()){
        Object element = itr.next();
        System.out.println(element + "\n");
    }
}
}

为什么要写:

Exception in thread "main" java.lang.ClassCastException: FoodItems cannot be cast to java.lang.Comparable
at java.util.ComparableTimSort.countRunAndMakeAscending(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at Test.main(Test.java:21)

【问题讨论】:

  • 发布 FoodItems 的来源

标签: java


【解决方案1】:
  • 实现Comparable的对象是Fegan

您在其中覆盖的方法compareTo 应该有一个Fegan 对象作为参数,而您将其转换为FoodItems。您的compareTo 实现应该描述Fegan 与另一个Fegan 的比较。

  • 要实际进行排序,您可能需要让您的 FoodItems 也实现 Comparable 并将您的实际 compareTo 逻辑复制粘贴到其中。

【讨论】:

    【解决方案2】:

    在使用自定义对象作为 Treemap 中的键时,我遇到了类似的问题。 每当您使用自定义对象作为 hashmap 中的键时,您将覆盖两个函数 equals 和 hashcode,但是如果您在此对象上使用 Treemap 的 ContainsKey 方法,则您还需要覆盖 CompareTo 方法,否则您将收到此错误 在 kotlin 中使用自定义对象作为 hashmap 中的键的人应该这样做

     data class CustomObjectKey(var key1:String = "" , var 
     key2:String = ""):Comparable<CustomObjectKey?>
     {
    override fun compareTo(other: CustomObjectKey?): Int {
        if(other == null)
            return -1
       // suppose you want to do comparison based on key 1 
        return this.key1.compareTo((other)key1)
    }
    
    override fun equals(other: Any?): Boolean {
        if(other == null)
            return false
        return this.key1 == (other as CustomObjectKey).key1
    }
    
    override fun hashCode(): Int {
        return this.key1.hashCode()
    } 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 2013-10-24
      • 2015-06-29
      相关资源
      最近更新 更多