java解析扩展了接口,结束了一个潜在的无限循环
考虑从
开始的类定义class Pokemon extends Playable<Pokemon>
这类似于更常见的class Pokemon implements Comparable<Pokemon>
,它只是对口袋妖怪施加了一个总的排序
尽管我已经看到并写了一段时间了,但我意识到(在回答了一个问题之后),至少从理论角度来看,如果不小心的话,解析过程中可能存在无限循环的风险
考虑这一点:步骤1:编译器或类加载器尝试分析(或加载)
Pokemon
,但发现它需要首先分析Playable<.>
步骤2:编译器随后实现,因为
Playable
由Pokemon
参数化,所以它需要加载或解析Pokemon
。现在我们发现自己进入了第一步,一个永无止境的循环已经建立
在实践中,我们知道情况并非如此,因为它是有效的。那么,循环是如何打破的呢?我的理论是,在第2步结束时,编译器或类加载器只是停止并使用对Pokemon的“引用”,而不是提取Pokemon源代码。但我对javac
或Classloaders
的了解还不够,无法肯定这一点。有人能称一下吗
# 1 楼答案
这类似于此声明中的“循环”:
为了处理
private LinkedListNode next
字段,编译器只需要知道LinkedListNode
是一个类型。此时不需要有完整的类型,因为类型名提供了足够的信息来声明字段类似地,当您声明一个泛型类,该泛型类引用自己的类型作为其继承结构的一部分时,编译器不需要完整的类型来完成对声明的解析