一个用于不同泛型类的接口

时间:2014-03-21 17:15:05

标签: java generics interface

我在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.

我知道这段代码无论如何都会出错,因为这些类可能没有相同的名称。但重点是:是否有可能编写一个可以用来实现所需行为的接口?如果有可能,怎么办呢?

2 个答案:

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