我有以下代码Java泛型意外行为:用于构造<X,Y>(C <Y>)和接口C <Y>
甲类模型一个ValueContainer<P>
和实体E
之间的映射。 (例如,一个复选框(ValueContainer)和东西,有一个布尔值。):
public abstract class ObjValContainerMapper<E, P> {
private ValueContainer<P> provider;
public ObjValContainerMapper(ValueContainer<P> provider) {
this.provider = provider;
}
public abstract P getValue(E entity);
public abstract void setValue(E entity, P value);
...
}
接口ValueContainer<P>
:
public interface ValueContainer<T> {
T getValue();
void setValue(T value);
}
定制复选框:
public class AdvancedCheckBox extends JCheckBox implements ValueContainer<Boolean>
而且一些代码,意外地不起作用:
AdvancedCheckBox chckbxBindToDrive = new AdvancedCheckBox(
"Bind to Drive");
ObjValContainerMapper<IndexSpec, Boolean> bindToDriveMapper =
new ObjValContainerMapper<IndexSpec, Boolean>(chckbxBindToDrive) {
@Override
public Boolean getValue(IndexSpec entity) {
if (entity == null) {
return false;
}
return entity.isBindToDrive();
}
@Override
public void setValue(IndexSpec entity, Boolean value) {
entity.setBindToDrive(value);
}
};
代码不能编译。显示的错误是“构造函数ObjValContainerMapper(AdvancedCheckBox)未定义”。除其他选项外,Eclipse还建议让AdvancedCheckBox实现ValueContainer或将参数chckbxBindToDrive强制转换为ValueContainer,尽管AdvancedCheckBox明确声明implements ValueContainer<Boolean>
。 奇怪的是,我已经重用了使用Java 6构建的旧项目中的代码,在这种情况下,相同的代码工作正常。 Java 7中有什么改变,或者我错过了什么?
环境:
- Eclipse的开普勒
- JDK 1.7.0_51
- 一些代码的WindowBuilder(在AdvacedCheckBox声明)产生
你为什么不试试用6编译,看看它是否工作? – jeremyjjbrown
对我开放-jdk-7 –
请尝试以下步骤,右键单击您的项目 - >构建路径 - >配置构建路径 - >库标记 - >添加库 - > JRE系统库 - >选择备用JRE - >选择jre安装在您的系统中 - >完成 – sasankad