Приведение лямбда в функциитерпит неудачу - PullRequest
0 голосов
/ 09 октября 2019

Функция отображения является в значительной степени копией стандартной функции отображения:

public <R> ObjStack<R> map(Function<T, R> mapping) {
    return ObjStack.of(mapping.apply((T) current), history());
}

Где T наследуется от сигнатуры класса ObjStack<T>

Использование

Function<Object, Integer> f = x -> x.hashCode();

в случае сбоя аргумента.

Object определенно входит в область действия T, и Integer не должно иметь значения, поскольку это R, который не ограничен.

 someInstance.map(x -> x + 1)

также ошибки, someInstance имеет тип ObjStack<Number>. На данные ссылаются, используя внутренний тип Object. Я использую и ограничен Java 8.

Редактировать:

Коды ошибок:

Error: line (7)
java: method map in class ObjStack<T> cannot be applied to given types;
  required: java.util.function.Function<java.lang.Number,R>
  found: java.util.function.Function<java.lang.Object,java.lang.Integer>
  reason: cannot infer type-variable(s) R
    (argument mismatch; java.util.function.Function<java.lang.Object,java.lang.Integer> cannot be converted to java.util.function.Function<java.lang.Number,R>)
Error: line (9)
java: bad operand types for binary operator '+'
  first type:  java.lang.Number
  second type: int

1 Ответ

1 голос
/ 09 октября 2019

Чтобы обеспечить гибкость в отношении общей сигнатуры фактического аргумента Function, необходимо указать соответствующие верхние и нижние границы для типа параметра:

public <R> R map(Function<? super T, ? extends R> mapping) {
    // code
}

Без этих границ Functionреализация должна точно соответствовать T и R. С этими границами реализация Function может соответствовать T или использовать любой супертип T и R или использовать любой подтип R. Причина, по которой первый универсальный параметр использует super, а второй универсальный параметр использует extends, заключается в том, что Function потребляет объект типа T, а создает объектвведите R - см. Что такое PECS (продюсер продлевает потребительский супер)? .


Относительно:

someInstance.map(x -> x + 1)

ЕслиsomeInstance - это ObjStack<Number>, тогда x - это Number в этом Function. Другими словами, вы создали Function<Number, ???> (где я положил ???, потому что я не знаю, должен ли тип возвращаемого значения быть Number или, например, Integer). В Java объекты типа Number нельзя использовать с математическими операторами (например, +). Вам нужно будет преобразовать x в соответствующий тип, например:

someInstance.map(x -> x.intValue() + 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...