如何解决我可以使用 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> func
的 CompleteParams 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")....)
之类的操作时,请检查现在每次调用都会发生的可读性混乱、堆栈跟踪脂肪和性能下降。你认为每次调用都写这个比调用旧的重载方法更干净吗?]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。