加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:14:33 所属栏目:Java 来源:网络整理
导读:interface PongT {}class PingT implements PongPong? super PingPingT { static void Ping() { Pong? super PingLong Ping = new PingLong(); }} 尝试编译这个错误: The system is out of resources.Consult the following stack trace for details.java.l
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,否则这是很难相关的.除非有人能提出一个引发同样问题的有意义的例子,否则我无法看到任何修改它的价值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读