【发布时间】:2011-06-05 10:38:29
【问题描述】:
给定一个通用接口
interface Foo<A, B> { }
我想写一个实现,要求 A 是 B 的子类。所以我想做
class Bar<A, B super A> implements Foo<A, B> { }
// --> Syntax error
或
class Bar<A extends B, B> implements Foo<A, B> { }
// --> illegal forward reference
但似乎唯一可行的解决方案是:
class Bar<B, A extends B> implements Foo<A, B> { }
这有点难看,因为它颠倒了泛型参数的顺序。
这个问题有什么解决方案或变通方法吗?
【问题讨论】:
-
Java 泛型是糖果般的 C++ 模板实现;有一个很好的理由 - 与现有代码库的向后兼容性。不要期望在任何时候都为他们感到高兴。不要嘲笑快乐有趣的泛型!
-
@dwb:嗯? Java 泛型的行为与 C++ 模板完全不同。例如,template specialization is completely missing from Java(虽然看起来已经朝着这个方向做了一些理论研究。而且 Java 也不支持非类型泛型参数。
-
有人可以告诉 Java 专家以只禁止参数之间的循环依赖的方式放松这个约束吗?如果我想担心声明顺序,我会编程 C ;)
-
@Arian:我认为这很可能是有某种原因的,他们不能(或不想)只是“放松这个约束”。我也不觉得这是一个值得大惊小怪的大问题……这是我第一次听说这是一个问题。
-
@Arian:嗯,你可以告诉他们。在这里试试:jcp.org/en/home/index 我认为真正的问题是他们并没有真正想象到有人会做 Bar 开始。您在网上找到的示例都采用 形式,其中 Something 是一个具体的已建立类。我怀疑他们没想到人们会在扩展的右侧使用泛型的任何参数,但碰巧由于事物的解析方式,它在有序时可以工作。
标签: java generics syntax-error