具有两个通用参数的类的Java泛型类型检查应该只包含相同类型的类

时间:2017-02-08 07:53:48

标签: java generics

我有一种情况,我想比较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);

是否可以进行类型检查,以确保一旦将对的类型添加到列表中,它们的类型相同,例如,在编译时失败?

2 个答案:

答案 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);
    }
}