通过XStream将XML转Bean中使用泛型的一点疑惑

今天在做XMl转为Bean的实例,遇到一个奇怪的问题,出代码先:
//工具类:
@SuppressWarnings("unchecked")
public  Object   readXml2Bean(String xml,Class rootClazz,Class headClazz,Class detailClazz){
try {
  xstream.alias("Root",rootClazz);
  xstream.alias("Head",headClazz);
  xstream.alias("Detail",detailClazz);
  return xstream.fromXML(xml);
}catch (Exception e) {
  e.printStackTrace();
  return null;
  }
}
//Head节点用泛型
public class PackRoot<T,M> {
  private T Head;
  public List<M> Detail_List;
  //getter/setter方法略
}
//Head节点用具体类型声明
public class PackRoot<M> {
  private PackHead Head;
  public List<M> Detail_List;
  //getter/setter方法略
}
//测试用例:
File file =new File("D:\\2001.xml");
BufferedReader bf =new BufferedReader(new FileReader(file));
StringBuilder sb=new StringBuilder();
String temp=null;
while((temp=bf.readLine())!=null){
sb.append(temp);
}
Object root=XMl2BeanUtil.getInstance().readXml2Bean(sb.toString(),PackRoot.class, PackHead.class,PackDetail.class);
if(root==null){
  System.out.println("解析报文出错[xml]="+sb.toString());
}
PackRoot<PackHead,PackDetail> rt=(PackRoot<PackHead,PackDetail>)root;
PackHead  head=rt.getHead();
List<PackDetail> details=rt.getDetail_List();
System.out.println("head="+head);
System.out.println("details="+details);
for(PackDetail detail:details){
System.out.println(detail);
}
报文结构:
<Root>
<Head>
   ......
</Head>
<Detail_List>
   <Detail>
     ......
   </Detail>
   <Detail>
     ......
   </Detail>
</Detail_List>
</Root>

场景:
  由于业务需求的报文头部(Head)和详情(Detail)里面节点内容不同,所以立马想到,在定义PackRoot时,通过泛型来该Head和Detail进行声明Head和Detail。

问题:
1:将Head和Detail都声明为泛型,代码见PackRoot(Head节点用泛型)! 就无法识别Head下面的子节点(错误如图);但是Detail是可以识别且得到对应子节点内容。
但是,将Head使用具体类型声明,Detail使用泛型声明,Head和Detail都能被解析。



不知道具体是什么原因?想不通!期待各位大侠高见,不吝赐教!!!

你可能感兴趣的:(xml、JavaBean)