接受包含特定方法的对象而不是接受特定类型

Accepting Objects containing specific method instead of accepting specific Type

[编辑]:这个问题是关于我无法控制的类型。所以让他们继承一个超类或实现一个接口是不可能的。我希望能够在不包装类型的情况下执行此操作。

我想编写一个方法,接受所有包含特定方法的对象作为参数。

例如,我们有 2 个完全不同的类型,它们都包含具有相同签名的 get 方法:

public class TypeOne {
  public int get() { /* Some implementation */ }
}

public class TypeTwo {
  public int get() { /* Some other implementation */ }
}

我如何编写一个接受这两种类型的方法?

public static int callGetOnObject(GettableObject gettableObject) {
  return gettableObject.get();
}

首先使方法 non-static,其次让两个 class 都实现一个具有 get 方法的接口。最后,更改 callGetOnObject 以接受实现该接口的 class 实例:

public interface Getter {
  int get();
}

public class TypeOne implements Getter {
  public int get() { /* Some implementation */ }
}

public class TypeTwo implements Getter {
  public int get() { /* Some other implementation */ }
}

然后:

public static int callGetOnObject(Getter gettableObject) {
  return gettableObject.get();
}

编辑:

由于问题已修改,这里是新答案:如果您不控制此代码并且您不愿意包装它,那么您就不走运了:没办法做到这一点 AFAIK。

据我所知,没有办法通过检查传入对象是否具有特定方法来真正过滤传入对象,但是您可以使用反射来验证输入,然后调用函数。这是一个例子:

 public static void ensureMethodThenCall(Object object, String methodName, Object... args) throws InvocationTargetException, IllegalAccessException{
    Method[] marr = object.getClass().getMethods();

    for(Method m: marr){
        if(m.getName().equals(methodName)){
            m.invoke(object, args);
        }
    }
}