比较不同类型的物体具有可比性

A.java

 public class A implements Comparable { private String id; private String name; public A(String a, String b) { id = a; name = b; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int compareTo(Object o) { A a = (A) o; return id.compareTo(a.getId()); } } 

B.java

 public class B implements Comparable { private String b_id; private String other; public B(String a, String b) { b_id = a; other = b; } public String getBId() { return b_id; } public void setBId(String id) { this.b_id = id; } public String getOther() { return other; } public void setOther(String other) { this.other = other; } public int compareTo(Object o) { B b = (B) o; return b_id.compareTo(b.getId()); } } 

Learn.java

 public class Learn { public static void main(String[] args) { List listA = new ArrayList(); List listB = new ArrayList(); List listAll = new ArrayList(); listA.add(new A("aa", "bb")); listA.add(new A("ae", "bbn")); listA.add(new A("dfr", "GSDS")); listB.add(new B("nm", "re")); listB.add(new B("asd", "asfa")); listAll.addAll(listA); listAll.addAll(listB); Collections.sort(listAll); for (Object o : listAll) { if (o instanceof A) System.out.println(o.getId); else if (o instanceof B) Syatem.out.println(o.getBId); } } } 

我得到的错误是在Collections.sort(listAll); 它说。

 Bound mismatch: The generic method sort(List) of type Collections is not applicable for the arguments (List). The inferred type Object is not a valid substitute for the bounded parameter <T extends Comparable> 

该怎么办? 其余的逻辑还可以吗?

我想要做的是有一个A列表和一个B列表,其中一个属性与id相同; 虽然变量名称不一样。 即A id和B中A bid 。现在我将这两个列表放在ListAll中,并在相同的变量id / bid上对它们进行排序。 我有A和B实现Comparable。

我的listAll是Object类型?

我该怎么做? 谢谢。

您可以添加公共基类并在那里实现比较,如:

 abstract class AandBComparable implements Comparable { public int compareTo(Object o) { AandBComparable ab = (AandBComparable) o; return getId().compareTo(ab.getId()); } public abstract String getId(); } 

为了能够对列表进行排序,其元素必须相互比较。 这不是这里的情况。 A的实例只能与A的其他实例进行比较.B的实例相同。

如果要对包含A和B实例的列表进行排序,则需要提供Comparator ,该Comparator器将乐意使用两个A s,两个B s或AB ,并根据需要比较这些对象。

 public class AOrBComparator implements Comparator { @Override public int compare(Object o1, Object o2) { String o1Id = getId(o1); String o2Id = getId(o2); return o1Id.compareTo(o2Id); } private String getId(Object o) { if (o instanceof A) { return ((A) o).getId(); } else if (o instanceof B) { return ((B) o).getId(); } else { throw new IllegalArgumentException("Can only get ID from A or B"); } } } 

但也许A和B应该实现相同的可识别接口,列表应该是List 。 这样,您可以轻松编写比较器来比较Identifiable的两个实例,无论实际实例是A,B还是任何其他可识别实例,它都可以工作。

我不相信exception会引发你告诉的地方,而是调用sort()

无论如何,它意味着类似的东西

“sort方法需要一个实现可比较的元素List 。但是你告诉他你正在给出一个Object列表,而不是所有的Object都实现了Comparable 。所以,编译器无法确定实时列表中传递的对象是什么实现Comparable(根据需要),并抛出错误“

解决方案? 使用实现Comparable的绑定类定义列表

  List listAll = new ArrayList(); 

更新:要使所有项目都在同一个列表中,则:

a)让所有项都来自实现Comparable的公共类/接口。 通常这将是最面向对象编程的友好方法,因为如果你想比较两个类,它们必须以某种方式相关。 从A扩展B,从B扩展A,从另一个类扩展A和B,或者使A和B实现另一个接口(它本身实现Comparable)。

b)正如JBNizet所说,使用Comparator

同样,我强烈建议使用解决方案。

你需要一个基础(虚拟)类来实现Comparable ,让A和B派生自类。 就像是:

 public abstract class MyComparableClass implements Comparable { } public class A extends MyComparableClass { ... // implementation of compareTo } public class B extends MyComparableClass { ...// implementation of compareTo } 

在您的主程序中,然后只需将Collection定义为:

 List listAll = new ArrayList();