【发布时间】:2019-12-12 10:47:13
【问题描述】:
我正在为 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
}
【问题讨论】:
-
嗯,一个问题是
MyGeneric extends Generic<Integer>将泛型类型定义为Integer但UsingGeneric<T extends Generic<T> & Comparable<T>要求它也 扩展或实现Generic<T>其中@987654333 @ 显然不行。 -
你需要类似:
UsingGeneric<T extends Generic<E>, E extends Comparable<E>> -
@Slaw 这看起来很棒。它只是迫使我有第二个类型参数
UsingGeneric<MyGeneric,Integer> myUsingGeneric,这有点多余但可以编译。考虑根据您的评论做出回答。