I found a solution to solve this problem:
@XmlRootElement public class Performance<M extends IMeasurement> { @XmlElementWrapper(name = "measurementsPerformance") @XmlElements({ @XmlElement(name = "measurement", type = MeasurementStringDouble.class), @XmlElement(name = "measurement", type = MeasurementStringInteger.class)}) private List<M> measurement; }
public interface IMeasurement<D extends Serializable, V extends Number> extends Serializable { D getDate(); void setDate(D date); V getValue(); void setValue(V value); }
@XmlTransient public abstract class MeasurementAbstract<D extends Serializable, V extends Number> implements IMeasurement<D, V>, Serializable { protected D date; protected V value; }
@XmlRootElement @XmlAccessorType(XmlAccessType.PROPERTY) public class MeasurementStringDouble extends MeasurementAbstract<String, Double> { @XmlElement @Override public String getDate() { return date; } @XmlElement @Override public Double getValue() { return value; } } @XmlRootElement @XmlAccessorType(XmlAccessType.PROPERTY) public class MeasurementStringInteger extends MeasurementAbstract<String, Integer> { @XmlElement @Override public String getDate() { return date; } @XmlElement @Override public Integer getValue() { return value; } }
The disadvantage of this solution is duplication of getters / setters in subclasses.
vimterd
source share