gpt4 book ai didi

java - 如何使用 Map 调用对象上的操作

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:50:53 25 4
gpt4 key购买 nike

我想在一段通用代码中调用特定的 setter。当然,我可以求助于 case 语句,但它会变大,所以我更喜欢 Map。

这是我到目前为止想出的:

public class Tester {

private static final Map<String, Setter<Target, ?>> MY_SETTERS = new HashMap<>();
static {
MY_SETTERS.put("SOURCE1", ( Target t, Source1 s ) -> t.setSource1( s ) );
MY_SETTERS.put("SOURCE2", ( Target t, Source2 s ) -> t.setSource2( s ) );
}

@FunctionalInterface
private interface Setter<T, S> {

void set( T target, S source );
}

public static void main( String[] args ) {

Target t = new Target();
MY_SETTERS.get( "SOURCE1" ).set( t, new Source1() );
}}

但是,这给了我一个“不兼容的类型:Source1 无法转换为 CAP#1 其中 CAP#1 是一个新的类型变量: CAP#1 从捕获的对象中扩展对象?"

我明白它失败的原因。但是,是否有一种优雅的方式可以在不诉诸 case 语句的情况下做到这一点?

最佳答案

由于 map 中的通配符类型,您必须在某处画一条线。这有点难看,但我有时会这样做:

定义一个通用的辅助方法,它将把 Setter 转换为您请求的类型:

public static <T, S> Setter<T, S> getSetter(String id) {
return (Setter<T, S>) MY_SETTERS.get(id);
}

像这样检索和调用 setter :

getSetter("SOURCE1").set(t, new Source1());

Java 将从您传递的参数中推断类型参数,并且调用本身看起来很好。不过,由于未经检查的强制转换,您会收到编译器的投诉。

显然,您必须绝对确定您请求的是您期望得到的,否则您将得到 ClassCastException。例如。执行以下操作会产生上述异常,因为您检索 Source1 的 setter 但使用 Source2 调用它:

getSetter("SOURCE1").set(t, new Source2());

关于java - 如何使用 Map 调用对象上的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43034969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com