我可以使用 params 对象在静态泛型方法中传递泛型类型参数吗?

问题描述

我正在重构一个已被重载多次以减少重载的泛型方法。我删除了所有重载,只留下一个方法,而是选择使用单个 params 对象封装传递给重载方法的所有参数。

是否可以将 -------------------------------------------------------------------------------- { '{' -------------------------------------------------------------------------------- ( group and capture to \1: -------------------------------------------------------------------------------- [$0-9a-zA-Z_]+ any character of: '$','0' to '9','a' to 'z','A' to 'Z','_' (1 or more times (matching the most amount possible)) -------------------------------------------------------------------------------- ) end of \1 -------------------------------------------------------------------------------- (?= look ahead to see if there is: -------------------------------------------------------------------------------- .* any character except \n (0 or more times (matching the most amount possible)) -------------------------------------------------------------------------------- } '}' -------------------------------------------------------------------------------- ) end of look-ahead 封装在 supplier<T> funcCompleteParams params 中,同时保留 complete(CompleteParams params) 的语义?

根据我在 Java Docs

中阅读的内容,我不确定这是否可行

泛型方法是引入自己的类型参数的方法。这类似于声明泛型类型,但类型参数的范围仅限于声明它的方法

之前的代码

complete(supplier<T> func,String param1,boolean param2)

当前代码

// multiple overloads
public static <T> T complete(supplier<T> func,String param1) {
    complete(func,null);
}

//original
public static <T> T complete(supplier<T> func,boolean param2) {
    final T = func.get();
}

CompleteParams.java

public static <T> complete(CompleteParams params) {
    final T = params.getFn().get();
}

解决方法

撇开这完全是一个糟糕的想法(见我上面的评论,再次抱歉=/),你想参数化你的参数类:

public class CompleteParams<T> {
    Supplier<T> func;
    String param1;
    Boolean param2;
}

public static <T> complete(CompleteParams<T> params) {
    final T = params.func.get();
}

请注意,语言“类型参数的范围仅限于声明它的方法”并不意味着您不能将一个范围内的类型变量用作另一种类型的参数!如果是这种情况,泛型将不会很有用...

(我不确定您的注释(即 @Builder)在那里做什么或它们属于哪个库。那是 Spring 吗?Lombok?您可能需要以特定方式进行设计以满足任何合同他们也暗示……)

[编辑:好的,您已经编辑了问题以表明这实际上是龙目岛。我提出的解决方案适用于 Lombok 的 @Builder,所以继续游戏。但是,当您执行诸如 WhateverClassItIs.complete(CompleteParams.<TYPE>.builder().param1("foo")....) 之类的操作时,请检查现在每次调用都会发生的可读性混乱、堆栈跟踪脂肪和性能下降。你认为每次调用都写这个比调用旧的重载方法更干净吗?]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...