Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法作为参数并签署合同?_Java_Reflection - Fatal编程技术网

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)
  }
}