Java泛型构造函数<X,Y>(C <Y>)和接口C <Y>的意外行为

bfo*_*our 5 java eclipse generics

我有以下代码:

一个模拟a 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);

    ...

}
Run Code Online (Sandbox Code Playgroud)

界面ValueContainer<P>:

public interface ValueContainer<T> {
        T getValue();
        void setValue(T value);
}
Run Code Online (Sandbox Code Playgroud)

自定义复选框:

public class AdvancedCheckBox extends JCheckBox implements ValueContainer<Boolean>
Run Code Online (Sandbox Code Playgroud)

并且一些代码意外地不起作用:

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);
    }
};
Run Code Online (Sandbox Code Playgroud)

代码无法编译.显示的错误是" 构造函数ObjValContainerMapper(AdvancedCheckBox)未定义 ".除了AdvancedCheckBox明确声明之外,Eclipse还建议让AdvancedCheckBox实现ValueContainer或将参数chckbxBindToDrive转换为ValueContainer implements ValueContainer<Boolean>.奇怪的是,我重用了使用Java 6构建的旧项目中的代码,在这种情况下大约是.相同的代码工作正常.Java 7有什么变化,或者我错过了什么?

环境:

  • Eclipse Kepler
  • JDK 1.7.0_51
  • 使用WindowBuilder生成的一些代码(AdvacedCheckBox声明)

bfo*_*our 1

感谢评论中的所有故障排除建议。

造成这种行为的原因是我将 ValueContainer 接口复制到两个不同的包中,因为我认为考虑到 Eclipse 似乎没有首先找到它,它会丢失(感谢 @sasankad 提出清理项目的建议)。我希望这对其他人仍然有帮助,因为编译器和 Eclipse 分别提供的错误消息和解决方案建议不是而且相当具有误导性。