当我尝试使用
StackOverflowError
编译以下代码时,我得到 javac
:
package test;
import test.Criteria.Builder;
public class Criteria<B extends Builder<? extends Criteria>> {
protected Criteria(Builder builder) {
}
// focus this
// if using the following code line to compile, the code will be compiled success
// public static <B extends Builder> B builder() {
public static <B extends Builder<E>, E extends Criteria<B>> B builder() {
return (B) new Builder<>();
}
public static class Builder<C extends Criteria<? extends Builder<C>>> {
}
}
我收到错误:
D:\workspace>javac Criteria.java
系统资源不足。
有关详细信息, 请参阅以下堆栈跟踪。
java.lang.StackOverflowError
at jdk.compiler/com.sun.tools.javac.code.Type.equalsIgnoreMetadata(Type.java:513)
at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.contains(Type.java:1150)
at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitTypeVar(Types.java:4769)
at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitTypeVar(Types.java:4724)
at jdk.compiler/com.sun.tools.javac.code.Type$TypeVar.accept(Type.java:1681)
我尝试使用以下 JDK 版本列表进行编译:
有人知道发生什么事吗?
Java编译器有问题还是我的代码有问题?我希望它能够成功编译。
堆栈溢出错误来自于编译器试图弄清楚
C extends Criteria<? extends Builder<C>>
和 B extends Builder<? extends Criteria>
的含义。您正在类型解析期间构建无限钻石问题。编译器尝试解析泛型类型Builder
。为此,它需要所有泛型类型参数,即 Criteria
。为此,它需要Builder
。递归到无限,直到堆栈大小超过系统分配给 javac
程序的大小,然后程序崩溃。