fre*_*ley 11 java stack-overflow compilation
interface Pong<T> {}
class Ping<T> implements Pong<Pong<? super Ping<Ping<T>>>> {
static void Ping() {
Pong<? super Ping<Long>> Ping = new Ping<Long>();
}
}
Run Code Online (Sandbox Code Playgroud)
尝试编译这会给出错误:
The system is out of resources.
Consult the following stack trace for details.
java.lang.StackOverflowError
at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2579)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:554)
at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:3260)
at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2592)
at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2579)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:554)
...
Run Code Online (Sandbox Code Playgroud)
显然,这是Java编译器中的一个错误.编译器不应该崩溃,尤其是在如此小的程序上.
它可能甚至是在Java语言规范的孔; 即JLS作者未考虑的泛型中的一个模糊边缘案例.
但是(IMO)这只不过是一种好奇心,除非你能想出一个不那么明显的设法打破编译器的例子.我的意思是,这个示例代码并不完全有意义......
对Java编译器实现有深刻理解的人可能会弄清楚为什么会导致堆栈溢出.但除非那个人也要解决这个问题,否则它几乎不相关.除非有人能够提出一个触发相同问题的有意义的例子,否则我认为修复它没有任何价值.
因为编译器不能决定一个是否Long是Pong是是super的Ping的Ping的Long,或者是否是Ping一个Ping的东西延伸Pong的Pong...但我可能是错的.