好了,这会很引人注目,先来杯咖啡提提神。思考一下下面两个类型:
现在告诉我,类型 C 和 D 到底是什么?
它们存在递归,是一种类似 java.lang.Enum (但有略微不同)的递归方式。看看:
在上面的描述中,enum 实际上只是单纯的语法糖:
认识到这一点之后我们回过头来看看前面提到的两个类型,下面的代码会编译成什么样?
非常难回答的问题,不过 Ross Tate 已经回答了。这个问题的答案是不可判定的:
C 是 Type super C> 的子类?
然后:
D 是 Type super D> 的子类?
在 Eclipse 中试着编译一下,它会崩溃! (不用担心,我提交了 BUG 报告:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=449554)
让这个事情沉下去…
Java 中某些类型的关系是不明确的!
如果你对 Java 这个用法感到奇怪之余也感兴趣,就去看看 Ross Tate 写的 “在 Java 的类型系统中使用通配符” (与 Alan Leung 和 Sorin Lerner 合著):
http://www.cs.cornell.edu/~ross/publications/tamewild/tamewild-tate-pldi11.pdf
我们也在讨论泛型多态中的相关子类多态性:
https://blog.jooq.org/2013/06/28/the-dangers-of-correlating-subtype-polymorphism-with-generic-polymorphism/