我正在开发一个具有通用流接口的项目,该接口提供类型的值:
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;
}
现在我想定义Stream接口的第二个实现,它只适用于Pair类,如下所示:
// Doesn't compile
class PairStream<Pair<T>> implements Stream<Pair<T>> {
// ...
}
然而,这不会编译。
我可以这样做:
class PairStream<U extends Pair<T>, T> implements Stream<U> {
// ...
}
但还有更优雅的方式吗?这是“正确”的方式吗?
答案 0 :(得分:5)
泛型类型参数Pair<T>
无效;你只需要声明<T>
并在实现界面时使用它。
// Just <T> here; Added missing (2nd) '>'
class PairStream<T> implements Stream<Pair<T>> {
public Pair<T> get() { /* ... */ }
}
答案 1 :(得分:1)
你真正需要的是
class PairStream<T> implements Stream<Pair<T>> {
// ...
}
这也可能有效:
class PairStream<U extends Pair<T>> implements Stream<U> {
// ...
}