假设我有几个接口只有一个抽象方法。有了这些接口,我可以用它声明 lambda:
interface A {
int c();
}
interface B {
int c();
}
public class Main {
public static void main(String... args) {
A a = () -> 42;
B b = () -> 42;
}
}
简短的问题:是否有一些技巧或技巧来限制使用A
lambdas 接口并在尝试这样做时使构建失败?任何暗示,无论是否肮脏,都是受欢迎的(“肮脏”是指编译/字节码级别的黑客攻击 - 不会影响源代码,最好是公共合同)。
长话短说:对于某些接口实现者,我考虑将其定义equals/hashCode
为合同的一部分。此外,我equals/hashCode
在构建时自动为它们生成。
在这种情况下,lambda 是麻烦制造者。对于接口的普通和匿名实现者,A
我可以.class
在构建时找到一个文件并检测其字节码。对于 lambda,有一个 VM 匿名类,在运行时生成。在构建时影响这样的类似乎是不可能的,所以我至少需要为一组特定的接口禁止这样的场合。