Java 如何使用扩展父映射器的子映射器方法

Java 如何使用扩展父映射器的子映射器方法,java,spring-boot,mapper,Java,Spring Boot,Mapper,我试图通过一个灵活的案例调用child mapper方法 但在这种情况下,我们不知道将调用哪个方法,即使它扩展了父映射器。[带mybatis的spring启动框架] // ParentMapper public interface ParentMapper { // List<Map<String, String> findAll(); } // Child1Mapper public interface Child1Mapper extends ParentMapp

我试图通过一个灵活的案例调用child mapper方法 但在这种情况下,我们不知道将调用哪个方法,即使它扩展了父映射器。[带mybatis的spring启动框架]

// ParentMapper
public interface ParentMapper
{
    // List<Map<String, String> findAll();
}

// Child1Mapper
public interface Child1Mapper extends ParentMapper
{
    List<Map<String, String> findAll();
}

// Child2Mapper
public interface Child2Mapper extends ParentMapper{
    List<Map<String, String> findAll();
}



@Autowired
Child1Mapper child1Mapper;

@Autowired
Child2Mapper child2Mapper;

// some class file
public ParentMapper getMapper(String param){
    switch(param){
        case "case1" : child1Mapper;
        case "case2" : child2Mapper;
        ... 10 more..
    }
}



public class example{
    public void somethid(){
        // this logic is in some biz
        ParentMapper mapper = getMapper("case1");  // <----`-` we do not know where `findAll method` located is in
        mapper.findAll();
    }
}
//父映射器
公共接口父映射器
{

//如果将
case1
传递给
getMapper(String param)
方法,它将返回
returnnewchild1mapper()
Child1Mapper对象,那么如果调用
findAll()
方法,则将调用
Child1Mapper
class
findAll()
方法

如果您通过了
case2
,那么您将得到
child2mapper
对象
(这类似于Parentmapper p=new child2mapper())
,因此如果您调用
findAll()
方法
(p.findAll())
child2mapper
findAll()
方法将被调用


child1mapper
child2mapper
都是
parentmapper
的子类,但是
child1mapper
child2mapper
之间没有关系,因此没有方法冲突的概念

无论你做什么都是绝对正确的

提供了:这里指的是实际的实现类,而不是接口

有兴趣知道: 您刚刚在这里实现了一个设计模式。 您的
getMapper
方法表示
Factory方法模式
。根据需要,这些类型的方法是绝对有效的


有关
工厂方法模式的详细信息

TLDR:ParentMapper中缺少方法签名

public interface ParentMapper
{
    List<Map<String, String>> findAll();
}
ParentMapper mapper=getMapper(“child1”);mapper.findAll()将使用
Child1Mapper
实例的实现

考虑到您正在使用Spring,您也可以调整出厂方法以返回SpringBean

我刚刚发现。。。。 如果ParentMapper和childmapper使用相同的方法,那么效果会很好

或者我们可以考虑反射……像这样

Mapper mapper = getMapperClass(name);
Method method = mapper.getClass().getMethod(mapperQueryId, Map.class);
return (List<Map<String, Object>>) method.invoke(mapper, params);
Mapper-Mapper=getMapperClass(名称);
方法Method=mapper.getClass().getMethod(mapperQueryId,Map.class);
return(List)method.invoke(mapper,params);

是这称为
运行时多态性
这是具有子对象的父引用,请检查此项(检查银行示例)谢谢您提供的信息。是的,您的案例我们可以使用Factory方法模式,然后我可以使用finAll方法,但此案例ParentMapper接口没有findAll方法。具体来说,此代码正在使用mybatis的spring boot framework上工作@김승갑 这是一个基本的面向对象特性。接口只是定义,您的子类将提供实际的实现。
public interface ParentMapper
{
    List<Map<String, String>> findAll();
}

// Child1Mapper
public class Child1Mapper implements ParentMapper
{
    public List<Map<String, String>> findAll() { /* implementation */ }
}

// Child2Mapper
public class Child2Mapper implements ParentMapper{
    public List<Map<String, String>> findAll() { /* implementation */ }
}
@Bean
Child1MapperBean() { return new Child1Mapper() }
@Bean
Child2MapperBean() { return new Child2Mapper() }

public ParentMapper getMapper(String param){
    switch(param){
       case "case1" : return Child1MapperBean();
       case "case2" : return Child2MapperBean();
    }
}
Mapper mapper = getMapperClass(name);
Method method = mapper.getClass().getMethod(mapperQueryId, Map.class);
return (List<Map<String, Object>>) method.invoke(mapper, params);