Проблема с отражением
Ниже приведен тест на отражение, который необходимо выполнить.Я считаю, что стирание типов - это то, что предотвращает это:
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class TestReflection extends AbstractCollection<String> {
private List<Integer> childCollection = new ArrayList<Integer>();
public List<Integer> getChildCollection() {
return childCollection;
}
public static void main(final String[] args) throws Exception {
final TestReflection testReflection = new TestReflection();
final Class<?> cls = testReflection.getClass();
Method method1 = cls.getMethod("getChildCollection", new Class[] {});
System.out.println(method1.getGenericReturnType());
Method method2 = cls.getMethod("getCollection", new Class[] {});
System.out.println(method2.getGenericReturnType());
}
}
Приведенный выше код выведет то, что показано ниже.Это связано с тем, что метод getCollection находится в контексте AbstractCollection, а не в TestReflection.Это необходимо для обеспечения обратной совместимости двоичных файлов Java:
java.util.List<java.lang.Integer>
java.util.List<T>
Альтернативный подход
Если элементы в коллекции будут аннотированы с помощью @XmlRootElement, то вы можете добиться того, что вы хотите сделать, с помощью следующего:
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAnyElement;
public abstract class AbstractCollection<T> {
protected List<T> collection = new ArrayList<T>();
@XmlAnyElement(lax=true)
public List<T> getCollection() {
return collection;
}
}
И если предположить, что Person выглядит следующим образом:
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Person {
}
Тогда следующий демонстрационный код:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(PersonCollection.class, Person.class);
PersonCollection pc = new PersonCollection();
pc.getCollection().add(new Person());
pc.getCollection().add(new Person());
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(pc, System.out);
}
}
выдаст:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person_collection>
<person/>
<person/>
</person_collection>
Для получения дополнительной информации см.: