Метод как параметр с подписью контракта? - PullRequest
2 голосов
/ 01 мая 2011

Я хотел бы знать, как создать контракт с вызывающей стороной для параметра 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")) { 
      ... 
    }
  }
}

Я хотел бы знать, как обеспечить, чтобы метод, передаваемый как «действие», принимал в качестве параметра String (т. Е. Обеспечивал бы метод action == load (String) {})? Есть ли что-то подобное:

public static void subscribe(Object class, Method action(String.class)) {

Я хочу сделать это в сигнатуре метода подписки, чтобы для вызывающего класса (ClassB) было очевидно, что он должен быть готов принять аргумент указанного типа.

РЕДАКТИРОВАТЬ: Обновлен последний бит кода, чтобы не отображать, как если бы метод был универсальным. Плохой выбор использования <> с моей стороны, чтобы представить пример того, что я пытался передать.

Ответы [ 3 ]

2 голосов
/ 01 мая 2011

Нет способа сделать это на Java.Класс 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 голос
/ 01 мая 2011

Не могли бы вы использовать небольшое изменение Командного шаблона ?

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.

1 голос
/ 01 мая 2011

В C # есть средства для достижения того, что вы пытаетесь сделать, но я не могу придумать, как гарантировать, что во время компиляции для Java.

вы можете прибегнуть к использованию intefaces?

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")) { 
      ... 
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...