接受包含特定方法的对象而不是接受特定类型
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);
}
}
}
[编辑]:这个问题是关于我无法控制的类型。所以让他们继承一个超类或实现一个接口是不可能的。我希望能够在不包装类型的情况下执行此操作。
我想编写一个方法,接受所有包含特定方法的对象作为参数。
例如,我们有 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);
}
}
}