我有一种情况,我想比较Java中的一对列表。我将使用Apache的这个Pair接口。
Pair的Left和Right值可以是实现Comparable的类型,所以我按如下方式声明List:
List<Pair<Comparable, Comparable>> listOfPairs;
左右值应始终为相同类型,例如Pair<String, String>
或Pair<Integer, Integer>
,两种情况都可以添加到同一个列表中。
这有效:
Pair<Comparable, Comparable> p1 = new ImmutablePair<>("a", "b");
Pair<Comparable, Comparable> p2 = new ImmutablePair<>(2, 3);
listOfPairs.add(p1);
listOfPairs.add(p2);
这也有效:
Pair<Comparable, Comparable> p3 = new ImmutablePair<>("a", 2);
listOfPairs.add(p3);
是否可以进行类型检查,以确保一旦将对的类型添加到列表中,它们的类型相同,例如,在编译时失败?
答案 0 :(得分:0)
是的,您可以实现自己的类,扩展ImmutablePair或Pair类。
示例:
public class MyPair<T> extends Pair<Comparable<T>, Comparable<T>> {
public MyPair(T key, T value) {
}
}
当您创建此类的实例时,两个参数的泛型T类型将始终相同。
答案 1 :(得分:0)
是的,如果该变量是局部变量,那么您可以将类型参数添加到声明它的方法中。
public <T extends Comparable> void myMethod() {
...
List<Pair<T, T>> listOfPairs;
...
如果他们是字段,您可以在类中添加类型参数。
public class MyClass<T extends Comparable> {
...
private List<Pair<T, T>> listOfPairs;
...
另一种选择,如果这些都不适合您的情况,就是定义您自己的Pair
泛型类,没有成员,然后根据需要使用它代替Pair
。你需要在这个类中编写一个构造函数,它只是委托给超类构造函数
public class SelfPair<T> extends Pair<T,T> {
public SelfPair(T first, T second) {
super(first, second);
}
}