我正在实施加权概率算法,所以我创建了一个通用的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
部分,它都是一样的。我错过了什么吗?有没有更好的方法呢?
答案 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;
}
}