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