Компилятор не распаковывает лямбда-параметр int - PullRequest
0 голосов
/ 05 июня 2019

Итак, я пытаюсь передать функцию для выполнения операции над значением int [x].

Итак, это мой метод:

public void apply(int index, UnaryOperator<Integer> func) {
    V[index] = func.apply(V[index]);
}

Это работает:

register.apply(0, new UnaryOperator<Integer>() {

                @Override
                public Integer apply(Integer x) {
                    return x & 6;
                }

            });

и это работает:

UnaryOperator<Integer> func = x -> x & 6;
register.apply(0, func);

Но это дает мне ошибку компиляции:

register.apply(0, x -> x & 6);

"Оператор & не может быть применен к Java.lang.Object, int "

Компилятор не может определить тип, даже если он определен в объявлении метода UnaryOperator<Integer>

Что яотсутствует?я слепой?или это просто не работает в Java?

Я использую Intellij CE Edition 2019.1.2 и OpenJDK 11.0.1 на MacBook.

1 Ответ

2 голосов
/ 05 июня 2019

Александр пример:

register.apply(0, (Integer x) -> x & 6);

Не работает, компилятор выдаёт мне:

несовместимые типы в лямбда-выражении, ожидаемый объект, но найдено целое число

Это работает:

register.apply(0, x -> (x & 6));

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

Но лучшим решением было использование интерфейса IntUnaryOperator, о котором я даже не подозревал в предложении RealSkeptic в комментариях выше.

public void apply(int index, IntUnaryOperator func) {
    V[index] = func.applyAsInt(V[index]);
}

Спасибо за вашу помощь

...