使用泛型类作为类型参数的上限

时间:2019-12-12 10:47:13

标签: java generics

我正在为Java中类型参数的通用界限而苦苦挣扎。我要实现的目标如下:

  • 我有一个通用类(示例代码中的Generic<>(1))
  • 我有一个泛型类,其中类型参数的作用域应超出第一个泛型类的类型(UsingGeneric<>(2);这已经很奇怪了,因为它迫使我重复Comparable约束)
  • 然后,我想用一个第三类(MyGeneric(3))来实例化第二个类,从而扩展了第一类的具体应用。

这样想:您有一个通用的容器类,其中的元素受到约束。您有一个通用的迭代器类,其作用域在此类容器上。现在,您要为具体容器创建具体的迭代器。

问题:语句(4)无法编译,抱怨: Type parameter MyGeneric is not within its bound; should extend Generic<MyGeneric>.

问题似乎是Java强迫我在上限处重复类型变量-这有点荒谬,因为与容器示例一样,我不希望我的具体容器属于以下类型“容器的容器”。我仍然希望它是“可比较的容器”类型。也就是说,UsingGeneric类应具有一个签名,其中主要类型变量与上限的类型变量分离,类似于UsingGeneric<T extends Generic<S> & Comparable<S>>。这是不可能的,AFAIK。

我在做什么错了?

示例代码:

class Test {

  static class Generic<E extends Comparable<E>> {}  // (1)

  static class UsingGeneric<T extends Generic<T> & Comparable<T>> {} // (2)

  static class MyGeneric extends Generic<Integer> {}  // (3)

  static UsingGeneric<MyGeneric> myUsingGeneric;  // (4) - won't compile

}

1 个答案:

答案 0 :(得分:2)

当前代码无法编译的原因是:

class UsingGeneric<T extends Generic<T> & Comparable<T>> { ... }

要求使用的类型参数必须同时实现 Generic<T>Comparable<T>Integer类可以实现后者,但不能实现前者,因此会产生编译错误。而且您必须再次指定Comparable范围的原因是因为UsingGeneric声明了一个 new 类型的参数T,该参数被用作 type参数Generic边界,这是此上下文中的参数化类型。由于Generic的类型参数受Comparable的限制,因此必须确保UsingGeneric的类型参数具有兼容的范围。

也就是说,您似乎正在寻找一种指定 Comparable类型一起使用的Generic类型的方法,而不要求该类型同时实现两者接口。这将需要两个类型参数:

class UsingGeneric<T extends Generic<E>, E extends Comparable<E>> { ... }

乍一看似乎多余,但是所有信息都是必需的。现在我们将E用作Generic的{​​{1}}边界的 type参数,同时允许T与{{ 1}}。但是同样,由于E的类型参数受T的限制,因此我们必须确保Generic具有兼容的边界。