2

我有两个类,都具有 int ID 属性,并且我必须两次创建这个 Comparator 类才能按 ID 对它们进行排序:

public class Class1Comparator implements Comparator<Class1> {

/**
 * Comparator Constructor.
 */
public Class1Comparator() {
}

@Override
public int compare(Class1 arg0, Class1 arg1) {
    return arg0.getId() - arg1.getId();
}
}

和完全相同的一个,但 Class2 而不是 Class1,一切正常,但是有没有办法将它们合并到一个类中?

4

5 回答 5

3

派生Class1Class2从包含公共 ID 的基类以及Comparator<BaseClass>.

例子:

public class BaseClass
{
    private int id;

    //.
    //.
    //.

    public static class CmpID implements Comparator<BaseClass>
    {
        @Override
        public int compare(BaseClass a, BaseClass b) {
            //Could be implemented null safe
            return a.id - b.id;
        }
    }
}

编辑:您还可以实现一个通用接口,例如

public interface IdentifiableObject
{
    int getId();
}

Class1和使用Class2。在这里,一个单一的实现Comparator<IdentifiableObject>就足够了。

于 2013-03-10T10:00:35.577 回答
1

创建一个接口 GetId,该接口定义实现它的类必须具有 getId() 方法。让您的类实现该接口,然后创建一个比较器,该比较器将任何实现该接口的类作为其参数。

于 2013-03-10T10:09:27.877 回答
0

将 Comparatorclass 称为不同的更通用名称,并更改为 . 这将允许您将相同的 Comparator 与不同的类一起使用。

于 2013-03-10T10:06:48.137 回答
0

基本上,您的问题没有适当的解决方案,因为如果您尝试比较两个不同类的实例,则会导致 ClassCastException,因为只能在属于同一类的对象之间进行比较。正如sam所建议的那样,一种解决方案可能是从另一个类扩展一个类。

于 2013-03-10T10:11:41.943 回答
0
  • 如果这些类有一个共同的祖先,则使用它来获取 ID 并
    执行比较。
  • 稍微拉伸一下 - 您可以使用反射来获取每个类的 id 属性。此解决方案会很慢且不可取。
  • 如果没有共同祖先并且您不控制代码库,那么您就不走运了。您当然可以进一步扩展它并使用动态代理来模拟java 中的鸭子打字,但投资回报率会非常低:)
于 2013-03-10T10:17:42.063 回答