如何使用相同接口的类链接比较器?

时间:2015-01-29 11:55:48

标签: java generics comparison

我想创建一个比较器,可以使任何类的比较器共享同一个接口。但是以下代码不起作用:

public class MainApp {
    public void test() {
        ComparatorChain<TestInterface> comp = new ComparatorChain<>();
        comp.addComparator(new TestAComparator());
        // ERROR: The method addComparator(Comparator<TestInterface>) in the type ComparatorChain<TestInterface> is not applicable for the arguments (MainApp.TestAComparator)
    }

    //more comparators for each class implementing TestInterface
    class TestAComparator implements Comparator<TestClassA> { //TestClassA implements TestInterface
        @Override
        public int compare(TestClassA o1, TestClassA o2) {
            return 0;
        }
    }
}

public interface TestInterface {

}

//more classes that implement this interface
public class TestClassA implements TestInterface {

}

这里有什么问题?我怎样才能实现这种比较?

1 个答案:

答案 0 :(得分:2)

这是预期的。 ComparatorChain<TestInterface>接受能够比较实现TestInterface的任何类的实例的比较器。您正在尝试向链中添加一个比较器,该比较器只能比较TestClassA的实例。因此,如果链接受了这个比较器,那么在比较TestClassA实例以外的任何东西时都会失败,这会破坏其类型安全性。

您想要做的事情根本不可能,因为您无法将TestClassB的实例与TestClassA的比较器进行比较,即使TestClassATestClassB分享了通用界面。