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,否则这是很难相关的.除非有人能提出一个引发同样问题的有意义的例子,否则我无法看到任何修改它的价值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |