1

我正在开发一个具有通用流接口的项目,该接口提供一种类型的值:

interface Stream<T> {
  T get();  // returns the next value in the stream
}

我有一个实现,它仅从文件或其他任何东西中提供单个值。它看起来像这样:

class SimpleStream<T> implements Stream<T> {
  // ...
}

我还希望有另一个提供成对值的实现(例如,为每次调用 get() 提供接下来的两个值)。所以我定义了一个小 Pair 类:

class Pair<T> {
  public final T first, second;

  public Pair(T first, T second) {
    this.first = first; this.second = second;
}

现在我想定义仅适用于 Pair 类的 Stream 接口的第二个实现,如下所示:

// Doesn't compile
class PairStream<Pair<T>> implements Stream<Pair<T>> {
  // ...
}

但是,这不会编译。

我可以这样做:

class PairStream<U extends Pair<T>, T> implements Stream<U> {
  // ...
}

但有没有更优雅的方式?这是做到这一点的“正确”方式吗?

4

2 回答 2

5

泛型类型参数Pair<T>无效;您只需要<T>在实现接口时声明并使用它。

//         Just <T> here;          Added missing (2nd) '>'
class PairStream<T> implements Stream<Pair<T>> {
    public Pair<T> get() { /* ... */ }
}
于 2013-06-24T21:01:33.670 回答
1

你真正需要的是

class PairStream<T> implements Stream<Pair<T>> {
  // ...
}

这也可能有效:

class PairStream<U extends Pair<T>> implements Stream<U> {
    // ...
}
于 2013-06-24T21:04:42.817 回答