回调早于功能.("自JavaFX 2.0以来".)JavaFX需要该功能,Java没有它,因此JavaFX定义了它.然后Java 8在更一般的上下文中引入了它.
你不能把一个投射到另一个,因为它们都不是另一个的子类型.但是,您可以通过lambdas将其分配给另一个,因为签名是相同的.
换一种说法:
Callback<String, Integer> lengthCB = s -> s.length(); // or String::length
Function<String, Integer> lengthFunc = (Function<String, Integer>) lengthCB ;
给出了一个类强制转换异常,但是
Callback<String, Integer> lengthCB = s -> s.length(); // or String::length
Function<String, Integer> lengthFunc = lengthCB::call ;
很好.
至于使用哪个,如果你用lambdas(或方法引用)实现它们,问题通常没有实际意义,因为编译器只会从上下文中推断出类型.
如果您实际上将它们分配给变量,或者使用类定义(而不是lambda)实现接口,那么您将被迫选择一个类型.您应该根据所需的用法和上下文执行此操作:如果要将其传递给需要回调的JavaFX对象,请使用回调,否则使用函数.
如果您将它们定义为类中的字段,则通常应该更喜欢Function,因为它适用于更广泛的上下文.再次,如果它直接用于JavaFX控件,使用a可能更有意义Callback.
| 归档时间: | 
 | 
| 查看次数: | 467 次 | 
| 最近记录: |