由于绑定,maven拒绝编译泛型类,即使在转换类之后也是如此

时间:2013-05-29 18:12:56

标签: java maven generics compiler-construction

这是我用来将父项的通用列表保存到父级的代码的简化版本。原谅我不得不手工改写而不是复制过去,没有办法从机器上复制这个问题。

MyObject<childType extends MyObject> {}

public class Model{


  HashMap<MyObject, Set<MyObject>> store= new HashMap<MyObject, Set<MyObject>>()


  public <childType extends MyObject> Set<childType> getChildren(MyObject<childType> parent)
  {

     return (Set<childType>) store.get(parent);
  }



  public void <T extends MyObject<?>> addChild(MyObject<T> parent, T child){
     Set<MyObject> childSet=store.get(parent);

     if(childSet==null){
        childSet=new Set<MyObject>();
        store.put(parent, childSet);
     }

     childSet.add(child);
 }

这在Eclipse中构建没有问题。但是,如果我清理我的类文件并运行maven安装,我会收到以下错误:

the parameter childType is not within its bound

getChildren上的定义发生错误。虽然我之前有一个不同的,但类似的问题,然后我参与了商店的参与,并且正在为了商店而转向Set。

我理解为什么这样的例外会在一般情况下发生,如果我不投。令我困惑的是我施法。我不明白为什么它会抛出错误并停止编译而不是接受演员,因为我说“jsut相信我,这是对的”并继续前进。

我相信如果重要的话我会使用mavin-compile-pluging 1.6版。

PS。我不知道为什么我的代码示例的格式是如此丑陋。如果有人可以解决它或告诉我如何解决它我会很感激。我以前从未遇到过这个问题......

2 个答案:

答案 0 :(得分:1)

这里需要两个解决方案。

每路易斯加入一个通用的? getChildren的MyObject定义的参数修复了我在原始问题中提到的错误消息...

给我留下了关于getChildren行返回行上显示的不可转换类型的原始错误消息。这是我试图解决模型试图解决的真正问题,这就是为什么我认为这个问题是没有投射。

事实证明错误 是一个失败。似乎maven使用的编译器(我假设javac)坚持因为我的转换而抛出错误到更具体的集合类型。实际上,我有一个可以包含任何MyObject实现的集合,即使它不是childType,我也会作为一组childType返回。我理解抱怨,我没理解的是为什么会发生这种情况我被投了。简短的回答,javac只是坚持在这里抛出一个错误,而eclipse编译器(在我看来)正确地只返回一个警告并继续运行。这就是我在运行maven,Eclipse编译器时间歇性地看到错误的原因。没有编译它的问题,只有当我运行maven时才最终将编译器转换为javac。我认为这是javaC实现中的错误和混乱行为,如果它拒绝接受显式转换只是因为它可能错了。

一旦我确认我对这种情况的理解是正确的,即编译器只是在抱怨我认为它不应该是一个真正的错误,我自己设置了hack来满足编译器。以下是两个问题的解决方法:

  public <childType extends MyObject<?>> Set<childType> getChildren(MyObject<childType> parent)
  {

     return (Set<childType>) (Set) store.get(parent);
  }

你看到套装中的双重演员。第一个演员使javaC'忘记'我的Set有一个参数化类型的MyObject。然后它将允许我将该集转换为特定的参数化类型的Set,因为它不“知道”我从不太精确的参数化类型的Set中进行转换。当然,从Set中进行投射意味着从一个偶数 less 精确定义set(我可以在其中有一个Enum或Float)到我特定的paraterized类型;但是javaC对此很好。是的,它最多会出现一个错误(包括丢弃注释,而忽略警告),这仍然会让我感到烦恼....

答案 1 :(得分:1)

好吧,一个双重演员,这很可怕,但它确实有效:我在Eclipse中编译代码时出现了类似的问题,但不是在maven下:这使得它在两种情况下都有效(它是一个javafx绑定):{{ 1}}。我将模型绑定到treeItem屏幕值。