3

私はこれらのクラスを持っています

public abstract class Unit
{
    public abstract UnitType getType();

    ...
}

public class Item extends Unit
{
    protected ItemType type;

    @Override
    public ItemType getType()
    {
        return type;
    }

    public void setType(ItemType type)
    {
        this.type = type;
    }

    ...
}

そして明らかItemTypeに拡張しUnitTypeます。

そして私は得る:

javax.el.PropertyNotWritableException: /WEB-INF/facelets/general.xhtml @23,165 value="#{bean.item.type}": The class 'com.example.Item' does not have a writable property 'type'.

共変の戻り値の型が EL (2.2) を混乱させる可能性があることは理解できますが、これはバグですか?

私はこれを使用して回避できます

  1. ジェネリック
  2. setType 署名をに変更しpublic void setType(UnitType type)、内部で instanceof を確認します
  3. オーバーライドを避けるためにメソッド名を変更する

回避策ではなく、本当の解決策はありますか?

4

1 に答える 1

1

java.beans.Introspector責任があるようです。Java には関連するバグが多数ありました: 70927447122138652871467948076788525。合成ブリッジ メソッドが原因で、共変の戻り値の型とジェネリックで問題が発生します。一部の Java 7 アップデート (45、51、67、71) では、サーバーをしばらく実行した後、問題が正しく発生しません。これはおそらく、Introspector および関連クラスのソフト参照/弱参照キャッシュに関連しています。

これらの問題はすべて Java 1.7.0_80 で修正されているようです (Mojarra 2.2.8 および Wildfly 8.2.0.Final でテスト済み)。

于 2015-04-28T12:00:59.510 に答える