注意:这个问题与枚举无关,因此不是重复的问题。 枚举被强制仅与自身进行比较,因为编译器生成类型参数,而不是Java递归类型参数。
我正在尝试找到将类声明为以下形式的优势:
public class Some<E extends Some<E>>
相对于将其声明为:
public class Some<E extends Some>
我尝试过提供返回
E
的方法和返回Some<E>
的方法,在复杂类层次结构中进行不同的交叉调用,每次尝试删除额外的<E>
时 - 没有新的错误/警告出现。
你能否向我展示一种证明这个额外的<E>
优势的方法?
我认为这是因为JDK声明的存在:<E extends Comparable<? super E>>
SO上其他问题的回答给出了以下解释:
通过使用附加结构,您知道任何扩展枚举的类仅可与其本身进行比较
但是,我可以轻松地打破这个理论:
public static class Animal<E extends Animal<E>> {
public boolean compare(E other) {...}
}
public class Cat extends Animal<Cat> { }
public class Dog extends Animal<Cat> { } // Note "Cat" !!!
尽管使用了通用递归,我仍然可以比较狗和猫。
Dog dog = new Dog();
dog.compare(new Cat());
翻译理论:
你应该知道,任何继承了Animal的类只能与自己进行比较
这是错误的 - 我比较了继承Animal的类Dog和Cat,而不是它本身。
Some<E extends Some<E>>
的情况,那么你很可能在程序的某个地方犯了架构错误。要么就是你已经转向了故意混淆 Java 代码的黑暗面。 - Parthian Shotextends Enum<SAME CLASS>
,但是额外的递归类型参数目前并没有增加价值(请参见我的回答)。 - Kinga OdeckaSome<E extends Some>
或者Some<E extends Some<E>>
而不是仅仅使用Some<E>
? - newacct