- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
这个问题在这里已经有了答案:
11 年前关闭。
Possible Duplicate:
java Enum definition
Better formulated question, that is not considered a duplicate:
What would be different in Java if Enum declaration didn't have the recursive part
最佳答案
这是一个常见的问题,这是可以理解的。看看this part of the generics FAQ对于答案(实际上,请尽可能多地阅读整个文档,因为它做得很好并且内容丰富)。
简短的回答是它强制类对自身进行参数化;这是父类(super class)使用泛型参数定义方法所必需的,这些方法与其子类透明地(“本地”,如果您愿意的话)。
编辑:例如,作为(非)示例,请考虑 clone()
方法在 Object
.目前,它被定义为返回类型 Object
的值。 .由于协变返回类型,特定的子类可以(并且经常这样做)定义它们返回一个更特定的类,但这不能强制执行,因此不能为任意类推断。
现在,如果 对象的定义类似于 Enum,即 Object<T extends Object<T>>
那么你必须将所有类定义为类似 public class MyFoo<MyFoo>
.因此,clone()
可以声明为返回类型 T
并且您可以在编译时确保返回值始终与对象本身完全相同(甚至子类都不匹配参数)。
现在在这种情况下,Object 没有像这样参数化,因为当 99% 的类根本不会使用它时,在所有类上都有这个包袱会非常烦人。但是对于某些类层次结构,它可能非常有用——我自己之前也使用过类似的技术来处理具有多种实现的抽象递归表达式解析器的类型。这种结构使得编写“显而易见”的代码成为可能,而不必到处进行强制转换,或者只是为了更改具体的类定义而进行复制和粘贴。
编辑 2 (实际回答您的问题!):
如果枚举被定义为 Enum<E extends Enum>
,那么正如你所说的那样,有人可以将一个类定义为 A extends Enum<B>
.这违背了泛型构造的要点,即确保泛型参数始终是相关类的确切类型。举一个具体的例子,Enum 将它的 compareTo 方法声明为
public final int compareTo(E o)
A
延长
Enum<B>
,
A
的实例只能与
B
的实例进行比较(无论 B 是什么),这几乎肯定不是很有用。通过附加构造,您知道
任何 扩展 Enum 的类只能与自身进行比较。因此,您可以在父类(super class)中提供在所有子类中仍然有用且特定的方法实现。
public final int compareTo(Enum o)
。这不是一回事,因为这样就可以将
java.math.RoundingMode
与
java.lang.Thread.State
进行比较,而编译器不会提示,这又是不是很有用。)
Enum
本身,因为我们似乎被挂断了。相反,这是一个抽象类:
public abstract class Manipulator<T extends Manipulator<T>>
{
/**
* This method actually does the work, whatever that is
*/
public abstract void manipulate(DomainObject o);
/**
* This creates a child that can be used for divide and conquer-y stuff
*/
public T createChild()
{
// Some really useful implementation here based on
// state contained in this class
}
}
T
来自
createChild
方法。这意味着:
SpellCheckingManipulator obj = ...; // We have a reference somehow
return obj.createChild();
SpellCheckingManipulator
,即使它使用的是父类(super class)的定义。这里的递归泛型允许编译器知道什么对我们来说是显而易见的,因此您不必继续转换返回值(例如,您经常需要处理
clone()
)。
BrandNewSloppilyCodedManipulator.createChild()
仍将是
BrandNewSloppilyCodedManipulator
的实例.如果粗心的开发人员试图将其定义为仅返回
Manipulator
,编译器不会让他们。如果他们尝试将类定义为
BrandNewSloppilyCodedManipulator<SpellCheckingManipulator>
,它也不会让他们。
compareTo
或
createChild
方法并防止它在处理特定子类时变得过于模糊。
关于java - 为什么在 java 枚举中声明为 Enum<E extends Enum<E>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3061759/
您好,我在最后一步使用了 add 和 offer 来添加我的元素。两者都返回 boolean 值,并且除了 NPE 之外都不会抛出任何异常。 public class ArrayDequeDemo
我正在做一个功能,用户的电子邮件客户端只打开一个预填充的内容 (javascript)。 问题是我在转换特殊字符时遇到问题,因此它们无法正确显示到电子邮件客户端(内容由 url 传递)。 我写了一个函
问题一: 在阅读 JDK 源代码时,我发现该方法 boolean add(E e);在接口(interface)中定义 Collection & Queue & BlockingQueue . 我无法
我想比较 SQL 中的两个 varchar,一个类似于 Cafe ,另一个 Café SQL 中是否有一种方法可以允许这两个值进行比较。例如: SELECT * FROM Venue WHERE Na
我正在研究一种方法来搜索文本中的特定单词并突出显示它们。该代码工作完美,除了我希望它也匹配相似的字母。我的意思是,搜索 fête 应该匹配 fêté、fete、... 有没有一种简单而优雅的方法来做到
所以我有一个非常简单的组件,它加载了一个简单的路由器。我正在使用所有基本的东西,比如 ngFor、ngSwitch、ngIf,我通过 COMMON_DIRECTIVES 注入(inject)它们 我收
我有一个类似 Brazil: Série A 的字符串,我的目标是转换为 Brazil: Serie A。 此外,方法应该转换和其他类似的情况:é -> e, š -> s, ė -> e , ą -
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
在我的 app.module.ts @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule
Sample查询: SELECT e FROM Employee e WHERE SUBSTRING(e.name, 3) = 'Mac' 在这种语法中,说 SELECT e 似乎很直观,即 e 现在
objective-c 中是否有一种简单的方法可以将所有特殊字符(如 ë、à、é、ä)转换为普通字符(如 e en a)? 最佳答案 是的,而且非常简单: NSString *src = @"Conv
我想将 ë 之类的字符转换为普通的 e。我正在寻找关于语言和人们如何输入城市的转换。例如,大多数人在搜索时实际上输入的是 Brasilia,而不是 Brasília。当 Rueters 等新闻机构报道
当我写作时 $("#new_lang").click(function(e) { alert("something"); e.stopPropagation(); }); 这里的 e 是什么,
> 的键是 E 的某些属性,值是具有该属性的 E
我想知道如何将 Java List 转换为 Map。映射中的键是列表元素的某些属性(不同的元素可能具有相同的属性),值是这些列表项的列表(具有相同的属性)。例如。 List --> Map> 。我找到
我试图理解,为什么我们需要 Deque 中的 Offer 和 OfferLast 方法,因为这两种方法都在Deque 的结尾/尾部。它有什么意义? 最佳答案 Queue 接口(interface)是在
这个问题是这个问题的延续 here .如果有人想知道为什么我需要做这样的事情,你可以在那个问题中找到理由。这并不重要,真的。 我需要这样的方法: public virtual Expression>
注意:这个问题与 Enum 无关,所以它不是重复的。Enum 被迫只与自身比较,因为编译器生成类型参数,而不是因为 java 递归类型参数。 我试图找到将类声明为的优势: public class S
注意:这个问题与 Enum 无关,所以它不是重复的。Enum 被迫只与自身比较,因为编译器生成类型参数,而不是因为 java 递归类型参数。 我试图找到将类声明为的优势: public class S
如果我有一个struct example *e,function(&e) 和function(e) 之间有什么区别? 一个例子。 这是第一个代码: #include struct example {
这个问题在这里已经有了答案: C# 7.0 ValueTuples vs Anonymous Types (2 个答案) 关闭去年。 这两个查询有什么区别? var query = from e i
我是一名优秀的程序员,十分优秀!