You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Groovy泛型内部类静态构造方法报错:构造器无法匹配的解决方法

问题原因

Result是External的非静态内部类,在Groovy/Java中,非静态内部类的构造器会隐式要求一个外部类External的实例作为参数,但success和failed是Result的静态方法——静态方法属于类本身,没有绑定任何外部类实例,直接调用new Result<T>(...)时,无法提供这个隐式的外部类实例参数,因此触发构造器不匹配的报错。

解决方案

最合理的修复方式是把Result改为静态内部类,这样它就不再依赖外部类的实例,静态工厂方法可以直接创建它的实例:

class External {
    static class Result<T> { // 添加static修饰符
        final T result
        final Boolean success

        private Result(T result, Boolean success) {
            this.result = result
            this.success = success
        }

        static <T> Result<T> success(final T value) {
            return new Result<T>(value, Boolean.TRUE)
        }

        static <T> Result<T> failed() {
            return new Result<T>(null, Boolean.FALSE)
        }

        T except(Closure<Exception> c) {
            if (success) {
                return result
            }
            throw c.call()
        }
    }
}

如果业务上必须保留Result为非静态内部类,需要在静态方法中先创建External的实例,再通过该实例创建Result(但这种写法不符合静态工厂方法的设计逻辑,仅作参考):

class External {
    class Result<T> {
        final T result
        final Boolean success

        private Result(T result, Boolean success) {
            this.result = result
            this.success = success
        }

        static <T> Result<T> success(final T value) {
            return new External().new Result<T>(value, Boolean.TRUE) // 先创建外部类实例
        }

        static <T> Result<T> failed() {
            return new External().new Result<T>(null, Boolean.FALSE)
        }

        T except(Closure<Exception> c) {
            if (success) {
                return result
            }
            throw c.call()
        }
    }
}

内容的提问来源于stack exchange,提问作者Gabriel Carrera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:13:38