Операторы switch с идентичными выражениями управления, но различные реализации

Чтобы понять, как работают дженерики, посмотрите этот пример:

    List<SubFoo> sfoo = new ArrayList<SubFoo>();
    List<Foo> foo;
    List<? extends Foo> tmp;

    tmp = sfoo;
    foo = (List<Foo>) tmp;

Дело в том, что это не было предназначено для локальных / членных переменных, а для сигнатур функций, вот почему это так осел в обратном направлении.

-1
задан Isaac Martin Otim 13 July 2018 в 09:22
поделиться

1 ответ

В моем варианте нет необходимости дополнительно упрощать ваши инструкции switch, так как они читаемы и делают разные вещи. Кроме того, для упрощения вам нужно будет добавить дополнительный слой абстракции, который здесь (на самом деле) невозможен.

Единственное, что вы могли бы здесь абстрагироваться, это параметр var. Хотя я бы не рекомендовал его, возможно, вы можете попробовать что-то вроде этого:

private Consumer<Integer> createConsumer(Runnable... actions) {
    return i -> {
        if (actions.length < i)
            throw new IllegalArgumentException();
        actions[i].run();
    };
}

Вы можете создать пользователя, который принимает суровое количество Runnable объектов

var consumer = createConsumer(
            () -> System.out.println("First"),
            () -> System.out.println("Second"),
            () -> System.out.println("Third"));

и выполните его, как

consumer.accept(0);

Если вам также понадобится инструкция по умолчанию Consumer<Integer> createConsumer(Runnable... actions, Runnable defaultOption), она может оказаться излишней.

Однако это будет только некоторый функциональный стиль оператора switch, который может сделать вещи еще более сложными, когда параметр не начинается с 0, но какой-то другой номер (вам нужно вычесть до 0), или если вы переключаете блок, есть «пробелы» «числа (0, 1, 3, ...).

0
ответ дан Glains 17 August 2018 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: