Java 为什么没有@NotFunctionInterface?

Java 为什么没有@NotFunctionInterface?,java,lambda,interface,annotations,Java,Lambda,Interface,Annotations,在设计API时,我经常会遇到警告,指出接口(恰好包含一个抽象方法)“可能会用@FunctionInterface注释” 这通常发生在自定义侦听器上(有点像ActionListener),但也发生在以下情况: public interface CommunicatorEnumerator { List<Communicator> enumerateCommunicators(); } 公共接口通信分子{ 列出通讯器(); } 所有这些接口都有一个共同点,那就是不排除将来会有

在设计API时,我经常会遇到警告,指出接口(恰好包含一个抽象方法)“可能会用@FunctionInterface注释”

这通常发生在自定义侦听器上(有点像
ActionListener
),但也发生在以下情况:

public interface CommunicatorEnumerator {
    List<Communicator> enumerateCommunicators();
}
公共接口通信分子{
列出通讯器();
}
所有这些接口都有一个共同点,那就是不排除将来会有人添加更多抽象方法。因此,理想情况下,我希望防止在lambdas中使用此类接口

拥有
@SuppressWarnings(“InterfaceMayBeAnnotatedFunctional”)
不会阻止lambda的使用。我想把它们标记为“非功能接口”


那么,为什么没有阻止lambda使用接口的构造(它不必是注释?

这只是IDE发出的警告,您应该能够有选择地关闭或禁用它

使用@FunctionInterface不会阻止扩展

@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

我会在警告不适用的地方禁用它,而不必担心扩展
@functional interface

这只是IDE发出的警告,您应该能够有选择地关闭或禁用它

使用@FunctionInterface不会阻止扩展

@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

我会在警告不适用的地方禁用它,而不必担心扩展
@functionanterface

如果向接口添加(非默认)方法,那么无论如何都会破坏API(实现该接口的任何人都需要添加该方法)。您可以使用具有更多方法的子接口扩展功能接口。这只是IDE中的一个警告,您可以将其关闭。@请注意,我没有看到一个用于此的用例。如果您想禁止在客户机代码中使用类,只需使用可见性修饰符(您可以将接口包保持私有,如果将其包装为外部类型,则可以将类保持私有)。如果您想禁止在API中使用类,那么,您真的不能,因为开发人员拥有对代码本身的完全访问权,并且可以做任何他想要的更改。你可以只记录预期用途,但仅此而已。阻止lambda使用会解决什么问题?我想我有点虚伪,因为如果向接口添加方法的开发人员可以修复其用法,他也可以修复lambda用法(如果有)。如果向接口添加(非默认)方法,无论如何,您都在破坏API(实现接口的任何人都需要添加该方法)。您可以使用具有更多方法的子接口扩展FunctionInterface。这只是IDE中的一个警告,您可以将其关闭。@请注意,我没有看到一个用于此的用例。如果您想禁止在客户机代码中使用类,只需使用可见性修饰符(您可以将接口包保持私有,如果将其包装为外部类型,则可以将类保持私有)。如果您想禁止在API中使用类,那么,您真的不能,因为开发人员拥有对代码本身的完全访问权,并且可以做任何他想要的更改。你可以只记录预期用途,但仅此而已。阻止lambda使用会解决什么问题?我想我有点虚伪,因为如果一个向接口添加方法的开发人员可以修复它的用法,他也可以修复lambda的用法(如果有的话).能够扩展一个
@functioninterface
的界面是另一个设计怪癖,但这是一个我不打算打开的另一个蠕虫。此外,这并不是我想要的。能够扩展一个
@functional interface
的界面是另一个设计怪癖,但这是一个我不打算打开的另一整罐蠕虫。而且这不是我问的。