为什么没有@NotFunctionalInterface?

时间:2017-01-18 09:51:01

标签: java lambda interface annotations

通常在设计API时,我会遇到一个警告,指出一个接口(恰好包含一个抽象方法)"可以使用@ FunctionalInterface"进行注释。

通常会出现自定义侦听器(有点像ActionListener),但也会出现这样的情况:

public interface CommunicatorEnumerator {
    List<Communicator> enumerateCommunicators();
}

所有这些界面都有一个共同点,就是不排除某人将来会添加更多抽象方法。理想情况下,我希望阻止在lambda中使用这些接口。

@SuppressWarnings("InterfaceMayBeAnnotatedFunctional")不能阻止使用lambda。我想将它们标记为&#34;而不是功能界面&#34;。

那么为什么没有一个构造(它不必是一个注释)阻止lambda使用接口呢?

1 个答案:

答案 0 :(得分:0)

这只是IDE的一个警告,您应该可以将其关闭或有选择地禁用它。

使用@FunctionalInterface不会阻止扩展。

@FunctionalInterface
public interface ISuper {
    void methodOne();
}
public interface ISub extends ISuper {
    void methodTwo();
}

public enum Sub implements ISub{
    INSTANCE {
        @Override
        public void methodTwo() {
            System.out.println("Wave Two");
        }

        @Override
        public void methodOne() {
            System.out.println("Wave One");
        }
    }
}

public class Main {
    public static void main(String[] args) {
    ISuper sup = () -> System.out.println("Hi");
    sup.methodOne();

    Sub.INSTANCE.methodOne();
    Sub.INSTANCE.methodTwo();

    ISub sub = new ISub() {
        @Override
        public void methodTwo() {
            System.out.println("Bye");
        }

        @Override
        public void methodOne() {

        }
    };
    sub.methodTwo();
    }
}

打印

Hi
Wave One
Wave Two
Bye

我会禁用不适用的警告,不用担心延长@FunctionalInterface