Java - 当方法名称不同时将代码提取到泛型方法

标签 java oop generics

我有一个代码可以迭代一些 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 重载)。

是否有一个好的模式来处理这种情况而不改变现在不是一个选项的原始类?

最佳答案

这不是很优雅,但你可以使用 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();

}

关于Java - 当方法名称不同时将代码提取到泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22301132/

相关文章:

java - myMethod() 的多线程问题

java - 使用静态摩尔斯电码

C# 将可枚举转换为接口(interface)

java - Integer 扩展 Number 但无法对 <?用 Integer 扩展 Number>

c# - 使用泛型属性调用重载方法会调用错误的重载

java - 如何在java中删除现有对象并创建新对象?

java - 分类和回归树 - 用 GINI 进行最优分割计算

php - OOP PHP — 如何有选择地调用类构造函数中定义的特定方法?

c# - 我如何传入 DateTime 的参数,使其对应于 C# 中所需的形式参数

Java继承概念与不明确的参数