Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有接受对象类的方法时双重分派_Java_Visitor Pattern_Double Dispatch - Fatal编程技术网

Java 具有接受对象类的方法时双重分派

Java 具有接受对象类的方法时双重分派,java,visitor-pattern,double-dispatch,Java,Visitor Pattern,Double Dispatch,我有一个Mapper类的实现,它在一个map(Object-Object)函数中接受Object作为参数。其余的map(T)函数接受整数或类等 当我尝试传递一个int时,它会自动装箱为整数,并调用映射(对象对象)而不是映射(整数) 我对双重分派做了一些研究,发现我可以使用访问者模式。但这不适用于我的情况,因为我不传递可以让它们实现带有accept()的接口的自定义对象 上述方法接受每个对象 当您有一个同时接受对象的方法时,是否有任何一种解决方案可以双重分派Java对象 public BaseMa

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

当我尝试传递一个int时,它会自动装箱为整数,并调用
映射(对象对象)
而不是
映射(整数)

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

上述方法接受每个对象

当您有一个同时接受对象的方法时,是否有任何一种解决方案可以双重分派Java对象

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

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

    public BaseMatcher map(Class<? extends Exception> klass) {
        return somethingOtherOther();
    }
public BaseMatcher映射(对象){
归还某物();
}
公共BaseMatcher映射(整数){
返回某物();
}

public BaseMatcher map(Class编译器对对象的所有了解都是对象,即对象的实例。因此调用
map(Object)

如果map方法需要根据所传递对象的类型执行不同的操作,那么它应该获取对象的具体类型,并相应地执行操作(使用
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);
    }
}
如果要映射对象,请将其包装到适当的可映射对象中(或使用lambda):

List mappables=new ArrayList();
add(新的IntegerMappable(2));
添加(新的StringMapable(“hello”);
添加(mapper->mapper.map(42));

编译器只知道对象是对象,即对象的实例。因此调用了
映射(对象)

如果map方法需要根据所传递对象的类型执行不同的操作,那么它应该获取对象的具体类型,并相应地执行操作(使用
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);
    }
}
如果要映射对象,请将其包装到适当的可映射对象中(或使用lambda):

List mappables=new ArrayList();
add(新的IntegerMappable(2));
添加(新的StringMapable(“hello”);
添加(mapper->mapper.map(42));

看看这个问题:。为了确定被调用方法的签名,它使用编译时类型(
对象
),而不是运行时类型。@JMSilla我已经搜索了所有可能的情况。这就是为什么我问这个问题,因为我想看看这个问题是否有可能的解决方案。请看这个问题:。要确定被调用的方法的签名,它使用编译时类型(
Object
),不是运行时类型。@JMSilla我已经搜索了所有可能的情况。这就是为什么我问这个问题,因为我想看看这个问题是否有可能的解决方案是的,问题是我试图避免有20-30行带有instanceOf检查的行。有没有您上次提到的可映射集合的示例?是的,就是这样是因为我试图避免使用20-30行带有instanceOf检查的代码。是否有您上次提到的可映射集合的示例?