我有这些类
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),所以这是一个bug吗?
我可以使用 来解决这个问题。- 泛型
- 修改setType签名为
public void setType(UnitType type)
,检查instanceof inside - 更改方法名称以避免重写
是否有一个真正的解决方案,而不是变通?
似乎是java.beans.Introspector
的责任。Java中有很多相关的bug:7092744、7122138、6528714、6794807、6788525。由于合成桥接方法,协变返回类型和泛型出现问题。在一些Java 7更新(45、51、67、71)中,问题不是以正确的方式出现的,而是在运行服务器一段时间后出现的——这可能与Introspector和相关类中的软/弱引用缓存有关。
所有这些问题似乎都在Java 1.7.0_80 (Mojarra 2.2.8和Wildfly 8.2.0.Final测试)中得到了修复。