我在Java中使用泛型有点麻烦,因为我不确定我想要实现的是否真的存在。
我写了下面的类(这里简化了,没有getter / setter):
public class Pair<T>{
public T firstEntry;
public T secondEntry;
public Pair(T p_First, T p_Second) {
this.m_First = p_First;
this.m_Second = p_Second;
}
}
现在我想要实际上是同一个类,但是firstEntry和secondEntry可能是不同类型的。例如,某些类是这样的:
public class PairMultipleType<T, K>{
public T firstEntry;
public K secondEntry;
public Pair(T p_First, K p_Second) {
this.m_First = p_First;
this.m_Second = p_Second;
}
}
但我想使用这样的类:
Pair<Integer> myPair = new Pair<Integer>(a, b); //Creates pair with one type.
Pair<Integer, String> myPair = new Pair<Integer, String>(a, "Hallo Welt"); //Creates pair with two types.
我知道这段代码无论如何都会出错,因为这些类可能没有相同的名称。但重点是:是否有可能编写一个可以用来实现所需行为的接口?如果有可能,怎么办呢?
答案 0 :(得分:4)
由于type erasure,您不允许执行的操作。评论中提出的建议是一个很好的选择:拥有Pair<T,K>
基类并具有扩展的SingleTypePair<T>
类。
class Pair<T, K> {
protected T firstEntry;
protected K secondEntry;
public Pair(T firstEntry, K secondEntry) {
this.firstEntry = firstEntry;
this.secondEntry = secondEntry;
}
}
class SingleTypePair<T> extends Pair<T, T> {
public SingleTypePair(T firstEntry, T secondEntry) {
super(firstEntry, secondEntry);
}
}
答案 1 :(得分:1)
您无法声明Pair
变量(或类本身)具有可变数量的类型参数。
但您可以做的是Pair
扩展PairMultipleType
,但将其唯一的类型参数定义为PairMultipleType
的两个参数。
public class Pair<T> extends PairMultipleType<T, T> {
public Pair(T p_First, T p_Second) {
super(p_First, p_Second);
}
}
请谨慎使用此设计,因为它很容易混淆您的通用类型参数。但你可以这样做:
Pair<String> pair = new Pair<String>("one", "two");
PairMultipleType<String, String> pair2 = new Pair<String>("one", "two");
PairMultipleType<Integer, String> pair3 = new PairMultipleType<Integer, String>(1, "one");