有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

当方法名称不同时,oop Java将代码提取到通用方法

我有一段代码,可以在MyType类型的一些对象上进行迭代:

// result is of type Map<Long, MyType>
for (final Map.Entry<Long, MyType> someMyTypeObject: result.entrySet() {
   // Do a bunch of stuff

   Status status = someMyTypeObject.getStatus();

   // Do some more stuff
}

不,我正在添加一个流来处理类型为Map<Long, MyNewType>的结果,它需要做完全相同的事情,而唯一的区别是返回状态的方法的命名不同(比如-getObjectStatus()而不是getStatus())。我无法更改这两种方法的名称

我想做这样的事情:

public <T> doIterationWork(Map<Long, T> result) {
   // Do a bunch of stuff

   Status status = someMyTypeObject.getStatus();

   // Do some more stuff
}

问题是——我不能使用这个方法,因为我不能判断哪种类型是T。我考虑过重载3种方法:

public void getStatus(MyType obj) { return obj.getStatus(); }

public void getStatus(MyNewType obj) { return obj.getObjectStatus(); }

public void getStatus(Object obj) { // throw exception }

但是我不能这样做,因为调用是根据静态类型而不是动态类型设置的(因此我将始终使用Object重载)

有没有一种好的模式可以在不改变原有类的情况下处理这种情况,而现在还不能选择


共 (1) 个答案

  1. # 1 楼答案

    它并不十分优雅,但您可以使用instanceof检查类型,强制转换对象并调用相应的方法

    比如:

    Status status;
    
    if (someMyTypeObject instanceof MyType) { // It's a MyType object
    
        MyType myTypeObject = (MyType) someMyTypeObject;
        status = myTypeObject.getStatus();
    
    } else { // It's a MyNewType object
    
        MyNewType myNewTypeObject = (MyNewType) someMyTypeObject;
        status = myNewTypeObject.getObjectStatus();
    
    }