为什么编译此代码会导致编译器堆栈溢出?

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)

代码由github上的etorreborre提供.

Ste*_*n C 6

显然,这是Java编译器中的一个错误.编译器不应该崩溃,尤其是在如此小的程序上.

可能甚至是在Java语言规范的孔; 即JLS作者未考虑的泛型中的一个模糊边缘案例.

但是(IMO)这只不过是一种好奇心,除非你能想出一个不那么明显的设法打破编译器的例子.我的意思是,这个示例代码并不完全有意义......


对Java编译器实现有深刻理解的人可能会弄清楚为什么会导致堆栈溢出.但除非那个人也要解决这个问题,否则它几乎不相关.除非有人能够提出一个触发相同问题的有意义的例子,否则我认为修复它没有任何价值.

  • 即使好奇心确实是一个错误,应该提交:http://bugreport.sun.com/bugreport/ (2认同)

Old*_*eon 6

因为编译器不能决定一个是否LongPong是是superPingPingLong,或者是否是Ping一个Ping的东西延伸PongPong...但我可能是错的.

  • 你扭曲了我的舌头......`*哎哟*` (2认同)