我正在使用Wicket 6 / Java 8,并添加了一些简单的类来利用Java 8的lambda功能(我知道后期的Wicket具有lambda支持,但我们现在无法升级)。我正在创建一个类似于PropertyModel的LambdaModel,希望这将消除需要硬编码表示属性嵌套路径的字符串的需要。
首先,我正在创建一个简单的只读版本。我已经制作了Function接口的可序列化版本来创建以下内容:
首先,我正在创建一个简单的只读版本。我已经制作了Function接口的可序列化版本来创建以下内容:
public class LambdaModelUtils {
public static <X,R> IModel<R> ofNested( IModel<X> target, SerializableFunction<?,?>... path ) {
// creates a model that works through each function in the path in turn
}
}
我的实现很好,但唯一的问题是以“高效”方式调用此方法会导致编译错误:
IModel<Parent> parentModel = ...
IModel<String> model = LambdaModelUtils.ofNested( parentModel,
Parent::getChild, Child::getName ); // Compile time error
我发现唯一的调用该方法的方式是以下代码:
SerializableFunction<Parent,Child> path0 = Parent::getChild;
SerializableFunction<Child,String> path1 = Child::getName;
IModel<String> model = LambdaModelUtils.ofNested( parentModel,
path0, path1 ); // works
这个表达有些拙劣,有更好的方式吗?
我在这里查看过,但似乎也不起作用:
List<SerializableFunction> path = Arrays.asList( Parent::getChild, Child::getName );
谢谢
SerializableFunction<?,?>
需要使用未经检查的转换,因此它并不比使用字符串表示属性更好,即根本没有编译时安全性。 - Holger