2017-01-11 8 views
2

Например у меня есть этот интерфейс:Может ли какой-либо интерфейс с одним методом считаться функциональным интерфейсом?

package tester; 

public interface Calculator{ 

    public int calculate(int a,int b); 

} 

или

package tester; 

@FunctionalInterface 
public interface Calculator{ 

    public int calculate(int a,int b); 

} 

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

package tester; 
public class A { 

    int a; 
    int b; 
    int sum; 
    A(Calculator c,int e, int d){ 
     a=e; 
     b=d; 
     sum =c.calculate(a, b); 

    } 
    int get(){ 
     return sum; 
    } 
} 

Класс бегун

package tester; 

public class runner { 

    public static void main(String a[]){ 

     System.out.println(new A((x,b)-> (x+b),1,2).get()); 
    } 
} 

код работает с или без аннотации, то почему аннотаций? Почему нельзя сказать, что любой интерфейс с одним методом может быть функциональным интерфейсом?

+3

http://stackoverflow.com/q/14655913/2711488 – Holger

ответ

4

Да любой интерфейс с одним абстрактным методом реализации может быть функциональным интерфейсом, аннотации FunctionalInterface не требуется, это только информативная аннотация, как указано в Javadoc.

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

...

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

7

FuntionalInterface аннотация является лишь подсказкой для компилятора и да, любой интерфейс с одним абстрактным методом может быть функциональным интерфейсом. Аннотации могут быть полезны для обнаружения ошибки в функциональном интерфейсе. Например:

@FunctionalInterface 
public interface ExampleInterface { 
} 

приведет к ошибке компиляции.