Java лямбда-выражения - явный тип цели - PullRequest
0 голосов
/ 04 июня 2018

Рассмотрим функциональные интерфейсы A и B extends A.Можно ли создать экземпляр, реализующий не только A, но и B с лямбда-выражением, когда требуется только A?

Пример:

interface A {
    void foo();
}

interface B extends A {}

void bar(A arg) {
    System.out.println(arg instanceof B);
}

/* somewhere in a block */
    bar( () -> {} ); // Prints "false"

Как я могвызовите bar(A), чтобы он печатал true?

Я бы нашел это полезным для прослушивателей событий, где подынтерфейсы могут указывать дополнительные данные о слушателе, например, если Listener также реализует ConcurrentListener, этовызывается одновременно.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вы можете явно привести лямбда-выражение к B:

bar((B)() -> {});

или присвоить лямбда-выражение переменной:

B lambda = () -> {};
bar(lambda);
0 голосов
/ 04 июня 2018

Просто выполните приведение, чтобы сообщить компилятору нужный вам тип:

A a = (B)() -> someAction();
System.out.println(a instanceof B); // true

Я бы нашел это полезным для прослушивателей событий, где подынтерфейсы могут указывать дополнительные данные о слушателе, например, еслиСлушатель также реализует ConcurrentListener, он вызывается одновременно.

Это звучит как плохой дизайн (хотя я не могу объяснить, почему ...).Может быть, вы могли бы иметь метод isConcurrent в интерфейсе, который должны реализовать разработчики?

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