Java泛型:非法的前向引用

Cep*_*pod 8 java generics syntax-error

给定一个通用接口

interface Foo<A, B> { }
Run Code Online (Sandbox Code Playgroud)

我想编写一个实现,要求A成为B的子类.所以我想这样做

class Bar<A, B super A> implements Foo<A, B> { }
// --> Syntax error
Run Code Online (Sandbox Code Playgroud)

要么

class Bar<A extends B, B> implements Foo<A, B> { }
// --> illegal forward reference
Run Code Online (Sandbox Code Playgroud)

但似乎有效的唯一解决方案是:

class Bar<B, A extends B> implements Foo<A, B> { }
Run Code Online (Sandbox Code Playgroud)

这有点难看,因为它颠倒了通用参数的顺序.
这个问题有什么解决方案或解决方法吗?

Eri*_*son 5

由于这在Java中是不可能的,因此尝试以Bar<B, A extends B>不同的方式思考.

声明变量时Bar,首先指定父类,然后指定子类.这是Bar有效的.不要认为它是倒退 - 认为它是前锋.父母应该自然地在孩子面前指定.您添加的这个附加关系是驱动参数顺序的因素,而不是底层接口.

  • @Platinum:说真的吗?我发现这里有很多很多不正确的答案,被无知的人误认为是正确的,并且被认为是最不乐于助人的.无论如何,由于OP想要的类型参数的排序是不可能的,我认为这是关于可以提供的最有用的答案,因为它超出了我可能给出的简单"否". (3认同)
  • @Platinum - 我当然没有像你读到的那样消极地阅读答案(虽然我看到最后一句话_could_可能采取错误的方式).没有他说OP在考虑它"错误"或使用另一个可能带有负面含义的词.使用"向后"与OP使用"反向"同义.有时候让事情变得困难而不直观的是没有合适的"心理模型"来处理.我认为提供一种不同的方式将事物视为"答案"并没有错. (3认同)