Заменить функциональный интерфейс на Function - PullRequest
0 голосов
/ 28 января 2019

Я немного запутался с этим кодом.Почему бы не скомпилировать?

@FunctionalInterface
public interface Inter {
  BigDecimal method (BigDecimal param);
}

public class Main {
  public static void main {
    Function<BigDecimal, BigDecimal> func = param -> BigDecimal.ZERO;
    Inter i1 = param -> BigDecimal.ZERO; // compile
    Inter i2 = func; // not compile
  }
}

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Посмотрите на описание пакета java.util.function .

Функциональные интерфейсы предоставляют целевые типы для лямбда-выражений и ссылок на методы.

Это не означает, что функциональные интерфейсы являются целевыми типами для переменных произвольных конкретных классов (таких как Function<BigDecimal, BigDecimal> в вашем случае).

Чтобы использовать Function<> (в вашем случае, в переменной с именем func) в контексте, который требует определенного функционального интерфейса (Inter), вы можете просто сделать его лямбда или ссылкой на метод:

Inter i2 = p -> func.apply(p);  // compiles

или

Inter i2 = func::apply;
0 голосов
/ 28 января 2019

Я вижу здесь 2 функциональных интерфейса (SAM), первый из них - Inter, а второй - FunctionalInterface, предоставляемый Java, и представляющий функцию, которая принимает один аргумент и выдает результат.

Просмотр Inter i2 = func; line, то, что вы пытаетесь сделать здесь, это присвоить один функциональный интерфейс другому функциональному интерфейсу, что здесь не имеет никакого смысла.

Я изменил ваш код и ввел новый функциональный интерфейс, надеюсь, это поможети очищает ваши сомнения.

@FunctionalInterface
public interface Inter {
    BigDecimal method (BigDecimal param);
}

public static void main(String args[])
{
    Function<BigDecimal, BigDecimal> func = param -> BigDecimal.ZERO;

    Inter i1 = param -> BigDecimal.ZERO; // compile

    //creating new functional interface which returns Inter lambda body.
    Supplier<Inter> interSuppFuncInter = () -> { return param -> BigDecimal.ZERO; };

    Inter i2 = interSuppFuncInter.get(); // now compile's
    System.out.println(i2.method(BigDecimal.ZERO)); // invoke i2 lambda by calling its  method and passing the param
}
0 голосов
/ 28 января 2019

func - это Function<BigDecimal, BigDecimal>, который не является подчиненным интерфейсом Inter.Поэтому его нельзя присвоить переменной Inter.

Тот факт, что оба параметра Inter и Function<BigDecimal, BigDecimal> являются функциональными интерфейсами, имеющими метод с одинаковой сигнатурой, не имеет значения, поскольку они не связаны между собой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...