与一个已知类的通用对?

时间:2015-09-19 15:21:32

标签: java generics

我正在实施加权概率算法,所以我创建了一个通用的Pair类。由于概率是使用数字计算的,因此Pair的值始终为Integer,但我希望它的工作方式是密钥可以是任何Object。这就是我得到的:

class Pair<K, Integer> {
    public K k;
    public java.lang.Integer v;

    public Pair(K k, java.lang.Integer v) {
        this.k = k;
        this.v = v;
    }

    // getters and other stuff
}

它工作正常,但我觉得很奇怪,无论我输入的是什么,而不是第一行中的Integer部分,它都是一样的。我错过了什么吗?有没有更好的方法呢?

3 个答案:

答案 0 :(得分:3)

class Pair<K, Integer>

相当于

class Pair<K, V>

其中第二个通用参数的名称恰好是Integer而不是V(因此隐藏了类型java.lang.Integer,这会强制您使用java.lang.Integer代替在代码中只有Integer,以避免冲突)。

您的班级应该只有一个通用参数:

class Pair<K>

答案 1 :(得分:2)

当您接受任何类型时,可以使用generics。 但由于您知道该类型为Integer,因此您无需将其设为 generic

具有一个泛型类型参数的新版本将如下所示:

public class Pair<T> {
    public T t;
    public int v;
    public Pair(T t, int v) {
        this.t = t;
        this.v = v;
    }
    // ...
}

当您只有一个泛型类型参数时,最好使用“T”字母命名。 此外,您现在可以使用int代替Integer

答案 2 :(得分:1)

您使用它的方式,Integer只是一个类型变量,与K相同。

如果您不需要该对的第二个值的类型作为参数,那么不要将其声明为类型参数,而只需在代码中使用Integer

class IntPair<K> {
    private K first;
    private Integer second;

    public Integer someIntegerSpecificFunction() {
        // do stuff to internalPair.second
    }

    K getFirst() {
        return first;
    }

    Integer getSecond() {
        return second;
    }
}