четверг, 27 марта 2014 г.

Ошибочка тут у нас

Неожиданное продолжение поста про лямбды.

Допустим, что есть интерфейс:
    interface I<T> {
        public T m(T value);
    }
и есть реализация этого интерфейса:
    I o = new I<Integer>() {
        @Override
        public Integer m(Integer value) {
            return value++;
        }
    };

IDEA подсветила выражение, предложив использовать лямбды. После чего, рефакторинг в одно нажатие изменил код так:
    I<Integer> l = value -> value++;

А теперь допустим, что в одном и том же методе существуют обе эти реализации. Как вы думаете, какие числа напечатаются?
    System.out.println(o.m(1));
    System.out.println(l.m(1));

Welcome to λ-hell!

2 комментария:

  1. Ну, чё, круто.
    Хотя тест синтетический, так как выражение return value++; не несет смысла, но забавно.

    Похоже на багу, так как это выражение так же выдает то же самое:
    I m = value -> {return value++; };
    sout(m.m(1));

    ОтветитьУдалить
  2. Что еще забавно, IDEA странно выдает предупреждения по первому и третьему варианту (показаны в IDEA одинаково):
    В первом варианте value++; подсвечено, как неипользуемая переменная, а в лямбда-варианте с блоком подсвечено, что return лишний и можно записать без блоков.

    ОтветитьУдалить