Java 另一个Gson多态性查询
与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
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;
}
}