【问题标题】:Angelika Langer Enum<E extends Enum<E>> decodingAngelika Langer Enum<E extends Enum<E>> 解码
【发布时间】:2013-08-27 23:59:33
【问题描述】:

根据我的Previous Question,我正在阅读来自Angelika Dissecting Enum 的文章。除了类型只能为其子类型实例化,子类型确实继承了一些常用方法之外,我看不懂这篇文章。

  1. 这样声明的抽象Enum类是什么意思?它有什么帮助?
  2. 上一部分的文档描述了三个方面,谁能给我解释一下?
  3. 我确实在代码草图中看到 Enum 类声明了 compareTo 方法。当 Enum 隐式实现 Comparable interface 时。为什么需要定义自己的compareTo方法?
  4. 好像是递归泛型的概念。递归泛型到底是什么意思?在做了一些研发并理解了我上一个问题的答案之后,我明白它会强制类本身被参数化。

不过,详细的解释会很有用。

【问题讨论】:

标签: java generics


【解决方案1】:

我认为将泛型类型声明为Type&lt;E extends Type&lt;E&gt;&gt; 的主要好处是此类泛型类将使子类继承返回或接受具有子类型类型的参数的方法。 java.lang.Enum中这样的方法有:

public final int compareTo( E o) { ... }
public final Class< E > getDeclaringClass() { ... }

所以,如果我们声明枚举Color,这隐含的意思是:

public class Color extends Enum<Color>

所以在Enum 的这个实例化中,类型参数E 被分配了类型参数Color,所以上述方法将如下所示:

public final int compareTo(Color o) { ... }
public final Class<Color> getDeclaringClass() { ... }

【讨论】:

  • 感谢@Katona,经过彻底阅读,我理解了这个概念。非常感谢您。我仍在寻找第 2 点和第 4 点的说明。
  • 如果声明为class Type&lt;E&gt;,您在此处所说的一切都同样适用
  • @newacct 你是对的,但是使用class Type&lt;E extends Type&lt;E&gt;&gt; 你可以强制E 只能是子类的类型。所以,虽然class Type&lt;E&gt; 允许class Sub extends Type&lt;String&gt; class Type&lt;E extends Type&lt;E&gt;&gt; 只允许class Sub extends Type&lt;Sub&gt;&gt;
  • @Katona:不,它没有,因为你可以拥有class AnotherSub extends Type&lt;Sub&gt;
  • @newacct 确实,我错过了。我仍然相信我的观点是正确的,当你想强制子类或实现的类型显示为函数的参数或返回值时,这种模式很有用,虽然它并不完美,但正如你所指出的那样,它可能会被滥用。
【解决方案2】:

当说Enum&lt;Color extends Enum&lt;Color&gt;&gt; 之类的内容时,听起来您正在声明一个泛型类型参数Color,以确保它使用与Color 匹配的类型参数扩展Enum

但这不是声明类的泛型类型参数的地方。您必须在类名旁边声明它们;您只能稍后在 extends 子句中使用它们。例如

//                Use "extends" here  ...                   not here.
public class MyClass<E extends MyClass<E>> extends MySuperClass<E>

在本例中,您将 class Color 声明为已在 Enum 上定义的泛型类型参数的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多