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

前端之家收集整理的这篇文章主要介绍了java – 为什么编译此代码会导致编译器堆栈溢出?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
interface Pong<T> {}
class Ping<T> implements Pong<Pong<? super Ping<Ping<T>>>> {
    static void Ping() {
        Pong<? super Ping<Long>> Ping = new Ping<Long>();
    }
}

尝试编译这个错误

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)
    ...

Code courtesy of etorreborre on github.

解决方法

显然,这是Java编译器中的一个错误.编译器不应该崩溃,特别是程序如此之小.

它甚至可能是Java语言规范中的一个漏洞;即JLS作者没有考虑的泛型的一个晦涩的边缘案例.

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

对Java编译器的实现有深入了解的人可能会弄清楚为什么会导致堆栈溢出.但是,除非该人还要修复这个bug,否则这是很难相关的.除非有人能提出一个引发同样问题的有意义的例子,否则我无法看到任何修改它的价值.

猜你在找的Java相关文章