首先我们必须在其他文件或同一文件中声明接口以用于lambda表达式。但是是否可以在方法声明中做到这一点呢?
public class LambdaAppJava8 {
public int fonk(
int a,
int b,
interface MyInterface{
public int call(int a, int b);
} anonim
) {
return anonim.call(a, b);
}
public static void main(String[] args) {
LambdaAppJava8 app = new LambdaAppJava8();
System.out.println(app.fonk(1, 3, (c, d) -> c + d));
}
}
没有方法可以在方法声明内声明接口,但可以将其设置为足够接近的嵌套类型。
public class LambdaAppJava8 {
private interface MyInterface {
public int call(int a, int b);
}
public int fonk(int a, int b, MyInterface anonim) {
return anonim.call(a, b);
}
public static void main(String[] args) {
LambdaAppJava8 app = new LambdaAppJava8();
System.out.println(app.fonk(1, 3, (c, d) -> c + d));
}
}
匿名的含义似乎也有误解interface
。您可以在方法内部声明匿名类,但这些类不会“即时”声明;它们仍然是在编译时创建的具有自己的类文件的类型,该类文件不小于顶级类型,实际上,情况恰恰相反。此类类型比顶级类型具有更大的类文件,因为它们包含有关定义它们的周围上下文的元信息。
如果有一种方法可以interface
在方法的参数列表中声明内部,则不会改变。它不会比在其他任何地方声明它更有效。但这需要特殊的作用域规则例外,因为在常规作用域规则下,您无法调用期望方法局部类型的参数的方法,因为调用者不会知道该类型。
但是请注意,上面的示例实际上是您想要实现的。您也可以更改MyInterface
to的声明,public
其他类可以使用lambda表达式调用该方法,就像用例一样,app.fonk(1, 3, (c, d) -> c + d)
而无需导入 MyInterface
。这似乎是您的问题所在,调用者不必处理interface
为该fonk
参数专门定义的问题,而编译器则可以。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句