Как / Почему мы можем сказать, что функциональные интерфейсы в Java 8 являются маркерными интерфейсами - PullRequest
1 голос
/ 21 июня 2019

В одном из недавних интервью мне задали вопрос: «Как мы можем сказать, что в java8 функциональные интерфейсы похожи на интерфейсы маркеров».

Я не смог ответить на этот вопрос.

Но я думаю, что у маркера даже нет никаких методов, в то время как функциональный интерфейс должен иметь один метод для переопределения.

Может ли кто-нибудь помочь мне понять, является ли это допустимым аргументом в каком-то контексте или сам вопрос неверен?

Ответы [ 3 ]

7 голосов
/ 21 июня 2019

Как правило, маркер интерфейс - это интерфейс, который один своим присутствием имеет некоторый эффект. Другими словами: какая-то структура будет использовать instanceof или, возможно, отражение, чтобы идентифицировать ситуации, когда какой-то объект или класс реализует этот интерфейс маркера, чтобы затем сделать что-то на основе этой информации.

И я согласен с вашим пониманием: называть конкретный метод этого интерфейса не является частью этого понятия «маркерный интерфейс», по крайней мере, в моей книге.

И помимо моей книги, это, кажется, хорошо известное соглашение: маркер интерфейсы не объявляют метод, см. здесь или там . Оба этих источника подчеркивают: интерфейс marker не имеет методов или констант.

Поэтому я согласен с вашей позицией: функции и другие интерфейсы в этом пакете не являются маркерными интерфейсами в этом строгом смысле.

С другой стороны, я сомневаюсь, что вы найдете «официальное» определение этого термина (например, в спецификации языка Java). А когда нет официального стандарта, люди могут придумать «значение» слов.

Так что, возможно, ваш интервьюер решил, что «быть SAM » интерфейсом тоже является «маркером». И я почти уверен, что ты не можешь судиться с ним за его мнение.

0 голосов
/ 23 июня 2019

Для того, чтобы функциональный интерфейс компилировался, кроме того, чтобы пометить интерфейс с помощью @FunctionalInterface, вы должны объявить один абстрактный метод как часть интерфейса.

Если вы попытаетесь скомпилировать интерфейс, помеченный @FunctionalInterface, но без абстрактного метода, вы получите:

FunctionalInterfaceAttempt.java:1: error: Unexpected @FunctionalInterface annotation
@FunctionalInterface
^
  JavaJava is not a functional interface
    no abstract method found in interface JavaJava
1 error

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

JavaJava.java:1: error: Unexpected @FunctionalInterface annotation
@FunctionalInterface
^
  JavaJava is not a functional interface
    multiple non-overriding abstract methods found in interface JavaJava
1 error

Я думаю, что такое поведение не соответствует определению интерфейса маркера.

0 голосов
/ 21 июня 2019

Некоторые дополнительные сведения: Функциональный интерфейс:

Из Java 8 Документы

public @interface FunctionalInterface Информационный тип аннотации, используемый для указания того, что объявление типа интерфейса предназначено дляфункциональный интерфейс, определенный в спецификации языка Java.Концептуально, функциональный интерфейс имеет ровно один абстрактный метод. Поскольку методы по умолчанию имеют реализацию, они не являются абстрактными.Если интерфейс объявляет абстрактный метод, переопределяющий один из открытых методов java.lang.Object, это также не учитывается в счетчике абстрактного метода интерфейса, поскольку любая реализация интерфейса будет иметь реализацию из java.lang.Object или где-либо еще.Обратите внимание, что экземпляры функциональных интерфейсов могут создаваться с помощью лямбда-выражений, ссылок на методы или ссылок на конструкторы.Если тип аннотирован этим типом аннотации, компиляторы должны генерировать сообщение об ошибке, если: Тип не является типом интерфейса, а не типом аннотации, перечислением или классом.Аннотированный тип удовлетворяет требованиям функционального интерфейса.Однако компилятор будет рассматривать любой интерфейс, соответствующий определению функционального интерфейса, как функциональный интерфейс, независимо от того, присутствует ли аннотация FunctionalInterface в объявлении интерфейса.

Возможно, ваш интервьюер хочет получить информацию оSAM.

Итак Функциональный интерфейс интерфейс маркера на всех.

...