我正在实现一个排序列表类,在这个类中我要对任何类型的对象进行排序,所以现在我想测试该对象是否具有可比性,
我使用此代码覆盖compareTo()方法: -
class MyObject implements Comparable { Object ob; MyObject(){ this.ob=new Object(); } public int compareTo(Object current){ if((ob.toString().compareTo(current.toString()))>1) return 1; else if((ob.toString().compareTo(current.toString()))<1) return -1; else return 0; } public String toString(){ return (String)ob; } }
所以现在我需要像这样为这些对象分配数字
class SortedListTest{ public static void main (String arg[]){ MyObject b1= new MyObject(); MyObject b2= new MyObject(); b1.ob=6; b2.ob=3; System.out.println(b2.compareTo(b1)); } }
但它一直给我这个例外: -
线程"main"java.lang.ClassCastException中的异常:java.lang.Integer无法强制转换为java.lang.String
GhostCat say.. 6
从概念上讲,这根本没有意义!
关键是:当您在列表中允许任意类型的对象时,"排序"这一概念在这里没有任何意义.
因此简短的回答是:忘记它.
从技术上讲,你的问题在这里:
return (String)ob;
该代码假定 obj是一个String.但是,当你允许任何类型的对象时,这不一定是真的.所以obj.toString()
会阻止运行时问题,但是; 如上所述:解决技术问题不是真正的答案.
让我们回到现实世界的例子:假设你被要求对桌子上的东西进行分类:勺子,刀子,杯子,香蕉,苹果.你打算怎么做?
如果有的话,你可以收回所有共同点的东西; 比如"重量".所以你把所有东西放在一个尺度上; 并用它来"排序"它们.
从Java的角度来看,对象唯一的共同点是String表示(当调用toString()
它们时)或数值(调用时hashCode()
).因此,您可以对这些属性进行"排序".哪个会起作用,但不会导致任何远程有用的东西.
换句话说:当您打算对列表的内容进行排序时,除了只允许列表中的"相同类型的对象"之外别无他法.这就是为什么java集合正是以这种方式工作的原因.在某种意义上:使用泛型来表达List
包含具有某种常见类型的对象.从概念的角度来看,这仅仅意味着:不允许任何东西进入特定列表,而只允许"具有共同点"的对象.
从概念上讲,这根本没有意义!
关键是:当您在列表中允许任意类型的对象时,"排序"这一概念在这里没有任何意义.
因此简短的回答是:忘记它.
从技术上讲,你的问题在这里:
return (String)ob;
该代码假定 obj是一个String.但是,当你允许任何类型的对象时,这不一定是真的.所以obj.toString()
会阻止运行时问题,但是; 如上所述:解决技术问题不是真正的答案.
让我们回到现实世界的例子:假设你被要求对桌子上的东西进行分类:勺子,刀子,杯子,香蕉,苹果.你打算怎么做?
如果有的话,你可以收回所有共同点的东西; 比如"重量".所以你把所有东西放在一个尺度上; 并用它来"排序"它们.
从Java的角度来看,对象唯一的共同点是String表示(当调用toString()
它们时)或数值(调用时hashCode()
).因此,您可以对这些属性进行"排序".哪个会起作用,但不会导致任何远程有用的东西.
换句话说:当您打算对列表的内容进行排序时,除了只允许列表中的"相同类型的对象"之外别无他法.这就是为什么java集合正是以这种方式工作的原因.在某种意义上:使用泛型来表达List
包含具有某种常见类型的对象.从概念的角度来看,这仅仅意味着:不允许任何东西进入特定列表,而只允许"具有共同点"的对象.