为什么以下代码会使 javac 崩溃?我们能做些什么呢?
我正在阅读这篇关于“Java中的奇怪事物”的文章,我遇到了一个有趣的概念:不可决定的类型。
请考虑以下三个类/接口:
public interface Type<T> { }
public class D<P> implements Type<Type<? super D<D<P>>>> { }
public class WildcardTest {
Type<? super D<Byte>> d = new D<Byte>();
}
显然,问题是,是否是 ;任何人都可以进一步解释这一点吗?D
Type<? super D<Byte>>
javac 1.8.0_60
在尝试编译时抛出很长的时间:StackOverflowError
WildcardTest
The system is out of resources.
Consult the following stack trace for details.
java.lang.StackOverflowError
at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4640)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3834)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3826)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:778)
at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4640)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3839)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3826)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:778)
at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4640)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3839)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3826)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:778)
at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4640)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3839)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3826)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:778)
此代码还会使整个 Eclipse IDE 崩溃。
作者已经向Eclipse团队提交了一个错误,但它没有得到任何投票(除了我的)。什么都能做到吗?这仅仅是编译器形式的停止问题吗?