我正在为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
}
答案 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
具有兼容的边界。