我想创建一个比较器,可以使任何类的比较器共享同一个接口。但是以下代码不起作用:
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 {
}
这里有什么问题?我怎样才能实现这种比较?
答案 0 :(得分:2)
这是预期的。 ComparatorChain<TestInterface>
接受能够比较实现TestInterface
的任何类的实例的比较器。您正在尝试向链中添加一个比较器,该比较器只能比较TestClassA
的实例。因此,如果链接受了这个比较器,那么在比较TestClassA实例以外的任何东西时都会失败,这会破坏其类型安全性。
您想要做的事情根本不可能,因为您无法将TestClassB
的实例与TestClassA
的比较器进行比较,即使TestClassA
和TestClassB
分享了通用界面。