我有以下代码:

一个对ValueContainer<P>和Entity E之间的映射进行建模的类。 (例如,一个复选框(ValueContainer)和具有 boolean 值的内容):

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);

    ...

}

接口(interface)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显式声明了implements ValueContainer<Boolean>,也让AdvancedCheckBox实现ValueContainer或将参数chckbxBindToDrive强制转换为ValueContainer。
足够奇怪的是,我重用了用Java 6构建的旧项目中的代码,在这种情况下,大约是。相同的代码工作正常。 Java 7有什么改变吗?

环境:
  • Eclipse开普勒
  • JDK 1.7.0_51
  • 用WindowBuilder生成的一些代码(AdvacedCheckBox声明)
  • 最佳答案

    注释中所有疑难解答的建议。

    造成这种现象的原因是,我将ValueContainer接口(interface)复制了两次到两个不同的程序包中,因为我认为它将丢失,因为Eclipse似乎没有首先找到它(建议使用@sasankad清理项目)。
    我希望这对其他人还是有帮助的,因为分别由编译器和Eclipse提供的错误消息和解决方案建议不是,而是会引起误解。

    关于构造函数<X,Y>(C <Y>)和接口(interface)C <Y>的Java泛型异常行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22162832/

    10-10 11:43