我想知道如果方法具有参数本身,如何与调用者的Method参数创建一个契约。所以我用......
ClassA {
String string_ = "HI";
public static void subscribe(Object class, Method action) {
action.invoke(class, string_);
}
}
ClassB {
ClassB() {
ClassA.subscribe(this, this.getClass().getMethod("load", String.class));
}
public void load(String input) {
if(input.equals("HI")) {
...
}
}
}
我想知道如何确保方法传递为“action”将String作为参数(即确保方法操作== load(String){})?有没有这样的东西:
public static void subscribe(Object class, Method action(String.class)) {
我想在subscribe的方法签名中这样做,这样调用类(ClassB)显然需要准备好接受指定类型的参数。
编辑:更新了最后一个代码位,因此不会显示为方法是通用的。使用<>的选择不佳就我而言,代表我试图传达的一个例子。
答案 0 :(得分:2)
在Java中无法做到这一点。 Method类不是通用的,并且没有办法如此,因为方法可以使用任意数量的参数,并且无法在可变数量的类型上使类成为泛型。
您可以做的最好的事情是声明自己的类型而不是Method:
public interface Action<T, P> {
public void invoke(T target, P parameter);
}
然后:
public static <T> void subscribe(T obj, Action<T, String> action) {
action.invoke(obj, string_);
}
ClassB() {
ClassA.subscribe(this, new Action<ClassB, String>() {
public void invoke(ClassB target, String parameter) {
target.load(parameter);
}
});
}
答案 1 :(得分:1)
在C#中有一些方法可以实现你想要做的事情,但我想不出一种方法来确保在java的编译时。
你可以使用接口吗?
interface ILoader{
void load(String input);
}
ClassA {
String string_ = "HI";
public static void subscribe(ILoader loader) {
loader.load( string_);
}
}
ClassB implements ILoader {
ClassB() {
ClassA.subscribe(this);
}
public void load(String input) {
if(input.equals("HI")) {
...
}
}
}
答案 2 :(得分:1)
你难道不能对Command Pattern进行轻微修改吗?
puclic interface LoadCommand {
public load(String input);
}
public class ClassB implements LoadCommand {
public load(String input) {
// do stuff here
}
}
public class ClassA {
String myInput = "HI";
public static void subscribe(LoadCommand command) {
command.load(myInput)
}
}
load
接口中的LoadCommand
方法需要一个String
参数。