2014-03-04 47 views
5

我有以下代码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声明)产生
+0

你为什么不试试用6编译,看看它是否工作? – jeremyjjbrown

+0

对我开放-jdk-7 –

+1

请尝试以下步骤,右键单击您的项目 - >构建路径 - >配置构建路径 - >库标记 - >添加库 - > JRE系统库 - >选择备用JRE - >选择jre安装在您的系统中 - >完成 – sasankad

回答

1

THX在评论中的所有故障排除建议。

导致此行为的原因是我将ValueContainer接口两次复制到两个不同的包中,因为我认为它会丢失,因为Eclipse似乎没有找到它(thx @sasankad提议清理项目)。 我希望这对其他人仍然有帮助,因为编译器和Eclipse分别提供的错误消息和解决方案建议不是也不是误导。