Java 另一个Gson多态性查询

Java 另一个Gson多态性查询,java,generics,gson,Java,Generics,Gson,与Gson相关的多态性风险之前已经被问过。但是我想知道关于超类的子对象列表的实现细节。请看以下示例: OrderForm createForm = ...; //Instantiate master object that contains list of Questions String json = m.gson().toJson(createForm); System.out.println("#1 Order form rendered to: " + json); System.ou

与Gson相关的多态性风险之前已经被问过。但是我想知道关于超类的子对象列表的实现细节。请看以下示例:

OrderForm createForm = ...;  //Instantiate master object that contains list of Questions
String json = m.gson().toJson(createForm);
System.out.println("#1 Order form rendered to: " + json);
System.out.println("#2 Qst list: " + m.gson().toJson(createForm.getQuestions()));
for(QuestionObject<?>q:createForm.getQuestions()) {
    if(q instanceof MultipleChoiceQuestion) {
        System.out.println("#3 Uncast question:" + m.gson().toJson(q) + "\n\n");
        MultipleChoiceQuestion t = (MultipleChoiceQuestion)q;
        System.out.println("#4 Cast question:" + m.gson().toJson(t) + "\n\n");
    }
}
这是设计的,还是Gson中的一个bug?如果是设计,有人能解释一下这个逻辑背后的目的吗?模型的缩写片段如下:

public class OrderForm implements Serializable {
    private String id;
    private String formName;
    private ArrayList<QuestionObject<?>> questions;
    public ArrayList<QuestionObject<?>> getQuestions() {
        return questions;
    }

    public OrderForm setQuestions(ArrayList<QuestionObject<?>> questions) {
        this.questions = questions;
        return this;
    }
}   

public abstract class QuestionObject<T extends Answerable<?>> implements Serializable {

    private String questionText = null;

    public void setQuestionText(String inText) {
        questionText = inText;
    }

    public String getQuestionText() {
        return questionText;
    }
}

public class MultipleChoiceQuestion extends QuestionObject<MultipleChoiceAnswer> {

    private static final long serialVersionUID = -2621426772513381609L;
    public static final int QUESTIONTYPE = 666;

    private List<String> choices;

    public void setChoices(List<String> choices) {
        this.choices = choices;
    }

    public List<String> getChoices() {
        return choices;
    }
}
公共类OrderForm实现可序列化{
私有字符串id;
私有字符串formName;
private ArrayList>getQuestions(){
回答问题;
}

public OrderForm setQuestions(ArrayList)您的问题是什么?如果我不清楚,很抱歉。我用斜体字说明了重点:为什么第一种情况不起作用?请注意,“choices”元素不是从第一个print语句开始呈现的,而是从后面的3开始呈现的。“需要注意的是,只有第一种情况不起作用”什么是“第一种情况”?还有什么其他情况有效?什么是“不起作用”?如果我不清楚,我很抱歉,但如果你阅读了问题,我会说明问题。上述代码中有4个System.out.println语句,这就是“情况”我指的是。第一个print语句显示了使用gson序列化的整个对象。它没有正确序列化。接下来的三个print语句序列化了对象实例的不同部分,并且它们确实正确序列化。为什么第一种情况不起作用?
public class OrderForm implements Serializable {
    private String id;
    private String formName;
    private ArrayList<QuestionObject<?>> questions;
    public ArrayList<QuestionObject<?>> getQuestions() {
        return questions;
    }

    public OrderForm setQuestions(ArrayList<QuestionObject<?>> questions) {
        this.questions = questions;
        return this;
    }
}   

public abstract class QuestionObject<T extends Answerable<?>> implements Serializable {

    private String questionText = null;

    public void setQuestionText(String inText) {
        questionText = inText;
    }

    public String getQuestionText() {
        return questionText;
    }
}

public class MultipleChoiceQuestion extends QuestionObject<MultipleChoiceAnswer> {

    private static final long serialVersionUID = -2621426772513381609L;
    public static final int QUESTIONTYPE = 666;

    private List<String> choices;

    public void setChoices(List<String> choices) {
        this.choices = choices;
    }

    public List<String> getChoices() {
        return choices;
    }
}