【问题标题】:Eclipse cannot resolve composite component attribute of abstract class typeEclipse 无法解析抽象类类型的复合组件属性
【发布时间】:2016-04-17 19:27:02
【问题描述】:

即使 Eclipse 在 bolt_component.xhtml 中标记行 #{cc.attrs.bolt.spec.size},代码似乎也能正常工作,因为无法解析 spec.size 的属性

bolt_component.xhtml

<composite:attribute name="bolt" type="model.bolts.Bolt" />
#{cc.attrs.bolt.spec.size}

我的抽象类

public abstract class Bolt implements Serializable {
protected BoltSpec spec;
    I have setSpec()
    but not a getSpec()

和具体的类

public class BoltHexHead extends Bolt implements Serializable {

private static final long serialVersionUID = 1L;
private BoltSpecHexHead spec;

public BoltSpecHexHead getSpec() {
    return spec;
}
public void setSpec(BoltSpecHexHead spec) {
    this.spec = spec;
    super.setSpec(spec);
}

我意识到为什么 Eclipse 会标记,因为我没有 getSpec() 但是当我在 Bolt 中添加 getSpec 时,我在控制器中得到一个空指针,它使用 HexHeadBolt .getSpec() 在不应该的时候结果为空是。

if (analysisHexHeadWithNutOperational.getBolt().getSpec().getSize() == null) {

我尝试了多种 getter setter private protected 等的组合......

Eclipse 的标记是一个错误吗?还是我的继承设置不正确我正在使用 Luna

编辑

添加的屏幕截图显示即使使用更干净的 DRY 代码,使用参数化属性,Eclipses 仍然标记“大小”无法解析,但仅在自定义组件中

编辑2

通过将spec 添加到 cc 接口,我可以让 Eclipse 停止标记

方面

<stk:bolt_component boltTypes="#{data.hexHeadBoltTypes}"
         bolt="#{hex_head_nut_operational.boltAnalysis.bolt}"
         spec="#{hex_head_nut_operational.boltAnalysis.bolt.spec}" />

抄送

composite:interface>
    <composite:attribute name="boltTypes" /> 
    <composite:attribute name="bolt" />
    <composite:attribute name="spec" />

【问题讨论】:

  • 您是否尝试过使用 代替?当类型是 Bolt 时,调用 bolt.spec 需要隐式向下转换为 BoltHexHead,因为编译器不知道要使用哪个 Bolt 子类,所以在编译期间无法拾取。

标签: java eclipse jsf abstract-class composite-component


【解决方案1】:

我猜您在弄清楚如何将抽象螺栓与通用抽象螺栓规范一起使用时遇到了麻烦。在具有公共属性(和 getter/setter)的良好抽象类中,不必在每个子类中重复 getter/setter 并委托给super。您的getSpec() 尝试中的错误很可能是您没有委托给super。此外,子类中重复的spec属性是不必要的。

public BoltSpecHexHead getSpec() {
    return (BoltSpecHexHead) super.getSpec();
}

public void setSpec(BoltSpecHexHead spec) {
    super.setSpec(spec);
}

其实这不是DRY。如果抽象类的属性又是抽象的,而你又想避免强制转换,那么最好将其设为参数化类型。

public abstract class BoltSpec {

    // ...

}

public abstract class Bolt<S extends BoltSpec> {

    private S spec;

    public S getSpec() {
        return spec;
    }

    public void setSpec(S spec) {
        this.spec = spec;
    }

}

public class BoltSpecHexHead extends BoltSpec {

    // ...

}

public class BoltHexHead extends Bolt<BoltSpecHexHead> {

    // ... (note: no getSpec()/setSpec() necessary!)

}

【讨论】:

  • 太棒了!你看穿了我的问题,看到了具体的问题;使用带有抽象 BoltSpec 的抽象 Bolt。但是,Eclipse 仍然将抽象类的属性 .size 标记为“无法解析大小”。尽管如此,代码仍然可以工作并实现更重要的 DRY。我已经为 fyi 添加了屏幕截图。
  • size 是否在 BoltSpec 中定义?
  • 是的。 @Id 私有字符串大小;加上 getter/setter。 Eclipse 不会抱怨仅在 cc 中的常规 .xhtml faclet 页面中的大小。
  • 那么这确实是 Eclipse 发出的第 (n) 个错误警告。
  • 如果我将规范添加到 cc 接口,我可以让它消失。 和 cc 。在界面中放一堆属性可以吗?
猜你喜欢
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 2019-08-06
  • 2014-11-10
  • 1970-01-01
相关资源
最近更新 更多