解析循环泛型类型时编译期间出现 StackOverflowError

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

当我尝试使用

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 版本列表进行编译:

  • oraclejdk-1.8.0_271
  • oraclejdk-17.0.8
  • openjdk-17.0.2
  • openjdk-21.0.1

有人知道发生什么事吗?

Java编译器有问题还是我的代码有问题?我希望它能够成功编译。

Bug参考java bug数据库; bugid:JDK-8324809

java stack-overflow
1个回答
4
投票

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

C extends Criteria<? extends Builder<C>>
B extends Builder<? extends Criteria>
的含义。您正在类型解析期间构建无限钻石问题。编译器尝试解析泛型类型
Builder
。为此,它需要所有泛型类型参数,即
Criteria
。为此,它需要
Builder
。递归到无限,直到堆栈大小超过系统分配给
javac
程序的大小,然后程序崩溃。

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