Java 方法作为参数并签署合同?
我想知道在方法本身有参数的情况下,如何与方法参数的调用者创建契约。所以我用Java 方法作为参数并签署合同?,java,reflection,Java,Reflection,我想知道在方法本身有参数的情况下,如何与方法参数的调用者创建契约。所以我用 ClassA { String string_ = "HI"; public static void subscribe(Object class, Method action) { action.invoke(class, string_); } } ClassB { ClassB() { ClassA.subscribe(this, this.getClass().getMeth
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作为参数(即确保方法action==load(String){})?有这样的产品吗:
public static void subscribe(Object class, Method action(String.class)) {
我想在subscribe的方法签名中这样做,以便调用类(ClassB)显然需要准备接受指定类型的参数
编辑:更新了最后一个代码位,这样就不会显示方法是泛型的。我选择了一个很糟糕的例子来表达我想要表达的内容。在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")) {
...
}
}
}
在Java中无法做到这一点。方法类不是泛型的,也不可能是泛型的,因为方法可以接受任意数量的参数,也不可能使一个类在可变数量的类型上是泛型的 您最好声明自己要使用的类型,而不是方法:
public interface Action<T, P> {
public void invoke(T target, P parameter);
}
公共接口操作{
公共void调用(T目标,P参数);
}
然后:
publicstaticvoidsubscribe(目标、动作){
action.invoke(对象,字符串);
}
类别b(){
订阅(此,新操作(){
公共void调用(ClassB目标,字符串参数){
目标载荷(参数);
}
});
}
您不能稍微修改一下吗
LoadCommand
接口中的load
方法接受一个String
参数。@Laurent:True,但我有一位智者曾写道“显式优于隐式”,我的感觉是,在接口中声明方法是正确的。我接受了这个答案,因为它正确地回答了在Java中没有办法做到这一点以及为什么,并给出了一个可能的解决方案。每个人似乎都以这样或那样的方式使用命令模式,因此我将它们都作为部分解决方案加以说明。据我所知,这并不完全是命令,因为命令界面上的方法采用了一个参数。指挥要点的一部分是它是独立的;像这样的任何参数都已打包到命令对象中。@Tom Anderson:你说得对。我改变了我的回答,说“稍微修改一下命令模式”
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);
}
});
}
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)
}
}