Java 8 中有一个令人惊讶的新特性:接口(interface)上的默认方法。事实上,令人惊讶的是,甚至 JDK 自己的 bean Introspector does not support它。由于 Java 8 是全新的,仅发布了一年左右,因此可以肯定地认为它不会很快得到修复。
所有这些意味着 JFace 数据绑定(bind)也不可能支持默认方法,正如您可以想象的那样,这是一个问题。我们已经有了一个自己的 Instrospector,但是有人知道如何扩展/修复/修补数据绑定(bind)以使用它而不是不起作用的默认值吗?
一些细节:错误报告的界面:
public static interface Named {
public default String getName() {
return "always the same";
}
}
异常看起来像这样:
java.lang.IllegalArgumentException: name property does not have a read method.
at org.eclipse.core.internal.databinding.beans.BeanPropertyHelper.readProperty(BeanPropertyHelper.java:94)
at org.eclipse.core.internal.databinding.beans.PojoValueProperty.doGetValue(PojoValueProperty.java:47)
at org.eclipse.core.databinding.property.value.ValueProperty.getValue(ValueProperty.java:57)
我们确实使用数据绑定(bind) 1.4.0,这是下载站点甚至为 Eclipse 4.4.2 提供的版本,我在某处看到了 1.4.2 版本,但经过一些无果的尝试后,我开始相信更换插件超出了我的能力。
最佳答案
在指定接口(interface)类型时,我能够绑定(bind)到默认方法支持的属性,如下所示:
IObservableValue observableValue = PojoProperties.value( Named.class, "name" ).observe( realm, named );
observableValue.setValue( "name" );
如果此方法不适合您,您可以自己创建一个 PojoValueProperty
并传入自定义创建的 PropertyDescriptor
。
PropertyDescriptor propertyDescriptor = ...
IObservableValue observableValue = new PojoValueProperty( propertyDescriptor, null ).observe( realm, named );
但是您会看到上面的代码访问内部类,并且您可能想要复制 PojoObservables.value()
的 property-name-split-code
关于java - JFace 数据绑定(bind)不支持默认方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29405738/