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
相关产品推荐
相关产品推荐

