为什么当我编译以下代码时会抛出 StackOverflow

问题描述 投票:0回答:1

当我尝试使用 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,或者,,我的代码已经磨损了?

应该编译成功了,

java stack-overflow
1个回答
0
投票

堆栈溢出错误来自于编译器试图弄清楚

C extends Criteria<? extends Builder<C>>
B extends Builder<? extends Criteria>
的含义。您正在构建一个无限钻石问题,它会创建无限数量的 v 表,直到堆栈大小超过系统分配给
javac
程序的大小,然后它就会崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.