当我尝试使用 javac 编译以下代码时,我得到
StackOverflowError
:
package test;
import java.io.Serializable;
import test.Criteria.Builder;
@SuppressWarnings({ "unchecked", "rawtypes" })
public class Criteria<B extends Builder<? extends Criteria>> implements Serializable {
private static final long serialVersionUID = 5066371601838698479L;
protected Criteria() {}
protected Criteria(B builder) {
}
// focus this
// if use 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>>> {
protected Builder() {
}
public Builder<C> page() {
return this;
}
public C build() {
return (C) new Criteria<Builder<C>>(this);
}
}
}
我收到错误:
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)
我正在尝试复制以下列表java版本:
oricaljdk-1.8.0_271 oricaljdk-17.0.8 openjdk-17.0.2 openjdk-21.0.1
有人知道发生了什么事吗?
我怀疑这个错误是java编译器的bug,或者,,我的代码已经磨损了?
应该编译成功了,
堆栈溢出错误来自于编译器试图弄清楚
C extends Criteria<? extends Builder<C>>
和 B extends Builder<? extends Criteria>
的含义。您正在构建一个无限钻石问题,它会创建无限数量的 v 表,直到堆栈大小超过系统分配给 javac
程序的大小,然后它就会崩溃。