Как использовать функцию как функцию в Java?

#java

Вопрос:

(Здесь новичок на Java) Я пытаюсь реализовать цепочку функций в Java, где типы ввода/возврата неизвестны. Они будут работать так, что на выходе F(n) будут кормить F(n 1) и так далее. Сначала мне нужно реализовать MyFunctionlt;?, ?gt; класс, но здесь начинается проблема.

Что я пробовал (упрощенно)

 public class MyFunction implements Functionlt;Object, MyListlt;? extends Objectgt;gt; {   private final Functionlt;Object, MyListlt;? extends Objectgt;gt; method;   public MyFunction(Functionlt;Object, MyListlt;? extends Objectgt;gt; method) {  this.method = method;  }   public MyListlt;? extends Objectgt; apply(Object input) {  return method.apply(input);  }   public static MyListlt;Stringgt; myMethod(MyClass myClass) {  return new MyListlt;Stringgt;();  }   public static void main(String[] args) {  MyFunction myFunction = new MyFunction(input -gt; myMethod(input));  // ^^^^^^^^  // |  //  ---------------------------------------------   // |  // v  // The method myMethod(MyClass) in the type MyFunction is not   // applicable for the arguments (Object)  } }  

Насколько я знаю, в java все является объектом. Но здесь ошибка говорит о другом.

Метод myMethod(MyClass) в функции типа myFunction неприменим для аргументов (объекта)

Затем я попробовал (игнорируя типобезопасность)

 public class MyFunction implements Function {   private final Function method;   public MyFunction(Function method) {  this.method = method;  }   public Object apply(Object input) {  return method.apply(input);  }   public static MyListlt;Stringgt; myMethod(MyClass myClass) {  return new MyListlt;Stringgt;();  }   public static void main(String[] args) {  MyFunction myFunction = new MyFunction(input -gt; myMethod(input));  } }  

И ошибка все та же, так apply как ожидает объект. Потому что

Функция типа myFunction должна реализовывать унаследованную абстрактную функцию метода.применить(объект)

Также пробовал

 public class MyFunction implements Functionlt;? super Object, MyListlt;? extends Objectgt;gt;  

На этот раз ошибка заключается в:

Супертип может не указывать никаких подстановочных знаков

Даже когда это работает, я не знаю, как его использовать, как показано ниже.

 public Object apply(? super Object input)  

Мои вопросы

В чем может быть проблема? Как я могу передать свое Functionlt;X, Ygt; в него?

Комментарии:

1. Обратите внимание, что в качестве параметра типа ? extends Object означает то же самое, что и просто ? .

2. Синтаксически ваша проблема заключается в том, что ввод-это объект, но myMethod ожидает, что он будет иметь тип MyClass. Поэтому просто измените этот параметр на Объект (или реализуйте функциюlt;MyClass,…gt; вместо функцииlt;MyClass,…gt;lt;Объект,…gt;). Однако семантически эта конструкция кажется немного неправильной…

3. myMethod объявляется public static MyListlt;Stringgt; myMethod(MyClass myClass) так, как он ожидает в качестве экземпляра аргумента MyClass . Позже вы используете input -gt; myMethod(input) в качестве аргумента для MyFunction(Functionlt;Object, MyListlt;? extends Objectgt;gt; method) конструктора. Обратите внимание, что этот конструктор берет функцию из Object -gt; MyListlt;? extends Objectgt;gt; , поэтому параметр lambda будет представлять Object тип. Это означает, что ваша лямбда input -gt; myMethod(input) такая же, как (Object input) -gt; myMethod(input) , но, как было сказано ранее myMethod , ожидает экземпляр MyClass . Вы видите в чем проблема?

4. Обратите внимание, что если у вас есть какая-то переменная супертипа, например Person person , вы можете назначить ей экземпляры для некоторых ее подтипов, таких как person = new TallPerson(); или person = new OldPerson(); . Теперь представьте, что у нас есть такой метод, как addToNBATeam(TallPerson tallPlayer) . Должен ли следующий код компилироваться Person somePerson = getTallOrOldPerson(); addToNBATeam(somePerson); ? Нет, потому что Java не может гарантировать, что person будет выполнено TallPerson то, что ожидается addToNBATeam методом. Та же проблема с myMethod(input) тем, где находится тип input Object .