gpt4 book ai didi

java - 当有接受 Object 类的方法时进行双重调度

转载 作者:行者123 更新时间:2023-12-02 03:30:31 25 4
gpt4 key购买 nike

我有一个 Mapper 类的实现,它接受 map(Object object) 之一中的 Object 作为参数。功能。其余map(T t)函数接受整数或类等。

当我尝试传递一个 int 时,它会自动装箱为 Integer 并调用 map(Object object)而不是 map(Integer integer) .

我对双重调度做了一些研究,发现我可以使用访问者模式。但这不适用于我的情况,因为我没有传递自定义对象,我可以让它们实现带有 accept() 的接口(interface)。

上述方法接受每个对象。

当您有一个也接受对象的方法时,是否有任何类型的 Java 对象双重分派(dispatch)解决方案?

public BaseMatcher map(Object object) {
return something();
}

public BaseMatcher map(Integer integer) {
return somethingOther();
}

public BaseMatcher map(Class<? extends Exception> klass) {
return somethingOtherOther();
}

对这些map()函数的调用如下:foo(Object object) { mapper.map(object); }这导致 map(Object object)被调用。

最佳答案

编译器只知道你的对象是对象,即对象的实例。所以 map(Object) 被调用。

如果您的映射方法需要根据传递的对象类型执行不同的操作,那么它应该获取对象的具体类型,并采取相应的操作(使用 instanceof, getClass() 或其他)。

替代方案确实是使用多态性。但要做到这一点,调用者必须提供可映射的集合,而不仅仅是对象的集合:

private interface Mappable {
BaseMatcher mapMe(Mapper mapper);
}

public class IntegerMappable {
private final Integer value;

public IntegerMappable(Integer value) {
this.value = value;
}

@Override
public BaseMatcher mapMe(Mapper mapper) {
return mapper.map(this.value);
}
}

当您想要映射对象时,可以将它们包装到适当的 Mappable 中(或使用 lambda):

List<Mappable> mappables = new ArrayList<>();
mappables.add(new IntegerMappable(2));
mappables.add(new StringMappable("hello");
mappables.add(mapper -> mapper.map(42));

关于java - 当有接受 Object 类的方法时进行双重调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38158366/

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