Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解析<;T扩展接口<;T>&燃气轮机;结束一个潜在的无限循环_Java_Generics_Classloader_Javac - Fatal编程技术网

Java 解析<;T扩展接口<;T>&燃气轮机;结束一个潜在的无限循环

Java 解析<;T扩展接口<;T>&燃气轮机;结束一个潜在的无限循环,java,generics,classloader,javac,Java,Generics,Classloader,Javac,考虑一个以 class口袋妖怪扩展了可玩性 这类似于更常见的类Pokemon实现了Comparable,它只是对Pokemons施加了一个总的排序 尽管我已经看到并写了一段时间了,但我意识到(在回答了一个问题之后),至少从理论角度来看,如果不小心的话,解析过程中可能存在无限循环的风险 考虑一下这一点: 步骤1:编译器或类加载器尝试解析(或加载)Pokemon,但发现需要先解析Playable。 第2步:编译器随后实现,因为可玩由口袋妖怪参数化,它需要加载或解析口袋妖怪。现在我们发现自己进入了第一

考虑一个以

class口袋妖怪扩展了可玩性

这类似于更常见的
类Pokemon实现了Comparable
,它只是对Pokemons施加了一个总的排序

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

考虑一下这一点:
步骤1:编译器或类加载器尝试解析(或加载)
Pokemon
,但发现需要先解析
Playable

第2步:编译器随后实现,因为
可玩
口袋妖怪
参数化,它需要加载或解析
口袋妖怪
。现在我们发现自己进入了第一步,一个永无止境的循环已经建立

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

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

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


同样,当声明一个泛型类,它将自己的类型作为其继承结构的一部分时,编译器不需要一个完整的类型来完成对声明的解析。

泛型不象C++模板。编译器不需要预编译泛型,因此它不是编译时的问题)。检查它的源代码,找出它是如何做到的。这是编译时的问题,但我认为oracle的人并不愚蠢,他们应该解决这个问题。但不知道怎么做。我不明白你为什么需要泛型来问这个问题。那么一个有自己类型变量的简单类呢?@shmosel这是一个很好的观点——编译器至少面临着类似的挑战。在这种情况下,您是否有关于如何解析的输入?您可能希望使用诸如解析与名称解析或语法与语义分析之类的区别来解释编译器不需要同时知道所有内容。你的“完整类型”概念暗示了这一点,但仍然相当模糊。