Java 8 方法参考:编译时的方法验证
我想使用Java 8的新方法引用在编译时提供对某些代码的更多验证。
假设我有一个需要一个参数的方法:一个“方法”进行验证。例如:validateMethod
validateMethod(foo, "methodA");
在这里,该方法将在运行时验证是否存在。foo#methodA()
使用方法引用,我希望能够做到:
validateMethod(foo::methodA);
因此,该方法的存在将在编译时进行验证。
问题在于,似乎必须将方法引用分配给功能接口。例如,这个:
Object dummy = foo::methodA;
生成错误:“此表达式的目标类型必须是功能接口”。
如果我创建一个与该方法具有兼容签名的功能接口,则它的工作原理:methodA
@FunctionalInterface
public interface MyFunctionalInterface
{
public String run();
}
MyFunctionalInterface dummy = foo::methodA;
现在,在编译时验证了 的存在,这就是我想要的!foo#methodA()
但。。。
假设不知道它必须验证的方法的签名。那么,是否仍有可能实现它?validateMethod
让我们假装我们不关心歧义和重载方法。在Java 8中是否有可能实现某种方法来触发任何方法引用的验证?
例如:
public class Foo
{
public String methodA()
{
return "methodA";
}
public String methodB(String str)
{
return "methodB";
}
public String methodC(String str, int nbr)
{
return "methodC";
}
}
Foo foo = new Foo();
validateMethod(foo::methodA); // Compile
validateMethod(foo::methodB); // Compile
validateMethod(foo::methodC); // Compile
validateMethod(foo::methodD); // Error!
是否有可能以这样一种方式实现,即任何方法引用都将被接受,以便在编译时验证该方法的存在?validateMethod
我试过了:
public void validateMethod(Object obj){}
但它不起作用:“此表达式的目标类型必须是功能接口"
这将起作用:
@FunctionalInterface
public interface MyFunctionalInterface
{
public String run();
}
public void validateMethod(MyFunctionalInterface param){}
但仅适用于类,因为它的签名(无参数)与函数接口的方法签名兼容!methodA
Foo
是否有可能以这样一种方式实现函数接口,即任何方法引用都是有效的参数,因此将在编译时进行验证?MyFunctionalInterface
您认为在编译时验证方法是否存在的任何其他方法?