有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java解析扩展了接口,结束了一个潜在的无限循环

考虑从

开始的类定义

class Pokemon extends Playable<Pokemon>

这类似于更常见的class Pokemon implements Comparable<Pokemon>,它只是对口袋妖怪施加了一个总的排序

尽管我已经看到并写了一段时间了,但我意识到(在回答了一个问题之后),至少从理论角度来看,如果不小心的话,解析过程中可能存在无限循环的风险

考虑这一点:
步骤1:编译器或类加载器尝试分析(或加载)Pokemon,但发现它需要首先分析Playable<.>
步骤2:编译器随后实现,因为PlayablePokemon参数化,所以它需要加载或解析Pokemon。现在我们发现自己进入了第一步,一个永无止境的循环已经建立

在实践中,我们知道情况并非如此,因为它是有效的。那么,循环是如何打破的呢?我的理论是,在第2步结束时,编译器或类加载器只是停止并使用对Pokemon的“引用”,而不是提取Pokemon源代码。但我对javacClassloaders的了解还不够,无法肯定这一点。有人能称一下吗


共 (1) 个答案

  1. # 1 楼答案

    这类似于此声明中的“循环”:

    class LinkedListNode {
        private String data;
        private LinkedListNode next;
        ...
    }
    

    为了处理private LinkedListNode next字段,编译器只需要知道LinkedListNode是一个类型。此时不需要有完整的类型,因为类型名提供了足够的信息来声明字段

    类似地,当您声明一个泛型类,该泛型类引用自己的类型作为其继承结构的一部分时,编译器不需要完整的类型来完成对声明的解析