簡體   English   中英

Eclipse無法解析抽象類類型的復合組件屬性

[英]Eclipse cannot resolve composite component attribute of abstract class type

即使Eclipse在#{cc.attrs.bolt.spec.size}標記#{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()變為null。

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

我已經嘗試了多種由私有保護的getters setters組合,等等。

Eclipse的標記是否是錯誤? 還是我使用Luna的繼承設置不正確

編輯

添加的屏幕快照顯示即使使用更干凈的DRY代碼,使用參數化屬性,Eclipse仍然標記“大小”無法解析,而只能在自定義組件中解析 在此處輸入圖片說明

EDIT2

通過將spec添加到cc接口,我可以使Eclipse停止標記

faclet

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

CC

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

我認為您在弄清楚如何將抽象螺栓與通用抽象螺栓規范一起使用時遇到了麻煩。 在具有通用屬性(和getter / setter)的良好抽象類中,不必在每個子類中重復getter / setter並將其委托給super 嘗試getSpec()出錯,可能是您沒有委托給super 此外,in子類中的重復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!)

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM