#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
.