0

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<A> listA = new ArrayList<A>();
        List<B> listB = new ArrayList<B>();
        List<Object> listAll = new ArrayList<Object>();
        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<T>) of type Collections is not applicable
for the arguments (List<Object>). The inferred type Object is not a valid substitute
for the bounded parameter <T extends Comparable<? super T>>

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

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

我的 listAll 是 Object 类型的?

我该怎么做?谢谢。

4

4 回答 4

2

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

abstract class AandBComparable implements Comparable {

  public int compareTo(Object o) {
    AandBComparable ab = (AandBComparable) o;
    return getId().compareTo(ab.getId());
  }

  public abstract String getId();
}
于 2012-08-10T12:03:55.537 回答
1

为了能够对列表进行排序,其元素必须彼此可比较。这不是这里的情况。A 的实例只能与 A 的其他实例进行比较。B 也是如此。

如果您想对包含 A 和 B 实例的列表进行排序,您需要提供Comparator将愉快地接受两个As、两个Bs 或 anA和 a 的列表B,并根据需要比较这些对象。

public class AOrBComparator implements Comparator<Object> {
    @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 应该实现相同的 Identifiable 接口,列表应该是List<Identifiable>. 这样,您可以轻松编写一个比较器来比较 Identifiable 的两个实例,无论实际实例是 A、B 还是任何其他 Identifiable,它都可以工作。

于 2012-08-10T11:57:48.827 回答
0

我不相信异常会在您所说的地方引发,而是在调用sort()

无论如何,这意味着类似

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

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

 List<A> listAll = new ArrayList<A>(); 

更新:要将所有项目放在同一个列表中,然后:

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

b)正如 JBNizet 所说,使用Comparator.

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

于 2012-08-10T11:57:29.187 回答
0

您需要一个基本(虚拟)类,它将实现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<MyComparableClass> listAll = new ArrayList<MyComparableClass>();
于 2012-08-10T12:07:33.953 回答