通用接口将self作为参数。递归泛型?

22

免责声明:我对Java泛型并没有很多经验,但我和同事们刚刚花了一个小时来解读一个类似于以下结构的接口:

interface HasAttributes<A extends HasAttributes<A, B>, 
                        B extends HasAttributesType<B>> extends Identification<B> {

当一个接口泛型采用一个类型参数本身时,这实际上意味着什么?它会产生什么效果?


你能否同时添加接口的至少一部分内容? - Zed
2
嗯,这是一个说明它的含义的解释。对于问题中蕴含的挫败感,我很抱歉,但您必须理解试图弄清极度复杂的代码所带来的挫败感。我们有四位经验丰富的开发人员试图理解第五个人(一位远程开发人员)编写的代码。我们中没有人能够理解它。经过一个半小时后。不用说,当我写这个问题时,我有点沮丧。 - Daniel Bingham
3
"Interface" 不是正确的 Java 语法。 - newacct
3
请阅读Angelika Langer的优秀解释:泛型常见问题解答我在自己的代码中也使用了这种方法,并且在阅读Angelika的常见问题解答之前也有同样的误解。我的博客 - Big Kahuna
1个回答

15

这是有意义的 - Java 的 Enum 类是一个类似情况的很好的例子:

public abstract class Enum<E extends Enum<E>>
    implements Comparable<E>, Serializable

这个关于Enum的Stack Overflow问题中,有一些启发性的答案可以为您解决这种特定泛型用法,并比我更优雅地回答。


14
这句话的意思是“这里有意义”。那为什么不解释一下这个意义呢?(注意,这里只是对原文的翻译,并没有对其进行任何解释或添加额外内容) - newacct
1
@newacct 虽然将问题链接的摘要内联是个习惯,但我认为在这种情况下复制粘贴链接答案并不更有价值(它是另一个SO问题的链接,所以与此问题具有相同的生命周期)... 请随意阅读并在此处总结链接的答案。 - Alexei Levenkov
@AlexeiLevenkov:好的,总结一下就是:没有理由那样做。没得商量。 - newacct
@newacct 我不这么认为... 对我来说,这是一种奇异递归模板模式,它有非常充分的存在理由。请注意,我对Java一无所知(因为我生活在C#世界中)-因此,类似于ILinkedList<T>:where T:ILinkedList<T>{public T next;}的等价物在Java中可能不存在。 - Alexei Levenkov
@AlexeiLevenkov:Java中的接口不能有字段。但是好吧,我们可以将其更改为一个方法T getNext();。该接口中没有任何内容依赖于T扩展ILinkedList<T>。如果您将其更改为interface ILInkedList<T> { ... },它将编译得很好。 - newacct
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接