list内元素继承问题

djvfe 2011-08-16 04:05:09
A是虚拟类
class B extends A

List<A> list = new ArrayList<A>();
for(...) {
A a = new B();
list.add(a);
}
A a = list.get(0);
然后这最后一行报类型转换错误,说不能从B类型转换为A类型
大哥们,知道这个怎么回事,如何解决吗
...全文
364 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
GeniusProgrammer 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 waynell 的回复:]

两种可能:1。楼主在玩我们。2。JDK问题,不支持范型。我觉得第二种可能性大一些。
[/Quote]


父类应用指向子类对象,不可能报错。楼上说的对,不够我倒是觉得楼主玩我们的可能性大一些。
dengyulong 2011-08-18
  • 打赏
  • 举报
回复
一点都没错
djvfe 2011-08-17
  • 打赏
  • 举报
回复
b.jar里对上一个解析xml的方法包装以备其他工程调用的方法
这个接口定义是在a.jar里的定义的


public class ABEBeanFacade2 implements Facade {
@Override
public List<FDDatasetBean> FDDataset(String[] parameters, String filter)
throws DisplayedException {
。。。。。。。。。。。。。。。。。。
return ParseXMLUtils.parseFDDatasetBean(result, "0");
。。。。。。。。。。。。。。。。。。
}
}

这是在当前工程中取得对应实现类的对象的方法

public class InvokUtility {
public static Facade getFacade() {
//return FacadeUtility.newInstance("com.hb56.abe.facade.ABEBeanFacade2");
return new com.hb56.abe.facade.ABEBeanFacade2();
}
}


这个就是最后报错的地方

public FDDatasetBean searchFDPrice(String[] parameters, String clazz) throws com.jj.flight.exception.DisplayedException {
try {
List<FDDatasetBean> fdList = InvokUtility.getFacade().FDDataset(parameters, null);
for (int i = 0; i < fdList.size(); i++) {
FDDatasetBean fdbean = fdList.get(i);//就是这一行报错,说无法转换java.lang.ClassCastException: com.hb56.abe.vo.FDDatasetBean cannot be cast to com.jj.flight.bean.FDDatasetBean
String _clazz = fdbean.getClazz() + (Utility.isEmpty(fdbean.getClassEx())?"":fdbean.getClassEx());
if(_clazz.equalsIgnoreCase(clazz))return fdbean;
}
return null;
} catch (com.jj.flight.exception.DisplayedException e) {
logger.error(e.getError_msg());
e.printStackTrace();
throw e;
}
}
nonoP 2011-08-17
  • 打赏
  • 举报
回复
学习。。。。。
djvfe 2011-08-17
  • 打赏
  • 举报
回复
b.jar里解析一个xml返回对象的方法,返回值定义是抽象类的

public static List<FDDatasetBean> parseFDDatasetBean(String result, String type) throws DisplayedException {
List<FDDatasetBean> beanList = new ArrayList<FDDatasetBean>();
try {
Document doc = DocumentHelper.parseText(result);
Element sfNode = doc.getRootElement();
//目前type=0 和type=1结果是一样的
String From, Arrive, Date, TPM, ClassYPrice;
if (type.equals("0")) {
From = sfNode.attribute("From").getText();
Arrive = sfNode.attribute("Arrive").getText();
Date = sfNode.attribute("Date").getText();
TPM = sfNode.attribute("TPM").getText();
ClassYPrice = sfNode.attribute("ClassYPrice").getText();
} else {
From = sfNode.attribute("From").getText();
Arrive = sfNode.attribute("Arrive").getText();
Date = sfNode.attribute("Date").getText();
TPM = sfNode.attribute("TPM").getText();
ClassYPrice = sfNode.attribute("ClassYPrice").getText();
}
Iterator<Element> elements = sfNode.elementIterator();
while (elements.hasNext()) {
Element element = (Element) elements.next();

String ID = element.attributeValue("ID");
String ElementNo = element.attributeValue("ElementNo");

String Carrier = element.elementText("Carrier");
String Farebase = element.elementText("Farebase");
String Price = element.elementText("Price");
String Totle = element.elementText("Totle");
String NotValidBefore = element.elementText("NotValidBefore");
String NotValidAfter = element.elementText("NotValidAfter");

String Clazz = element.elementText("Class");
String ClassEx = element.elementText("ClassEx");
String ReturnClass = element.elementText("ReturnClass");
String Code = element.elementText("Code");
String FuelTax = element.elementText("FuelTax");
String AirportTax = element.elementText("AirportTax");

FDDatasetBean fdBean = new com.hb56.abe.vo.FDDatasetBean(From, Arrive, Date, TPM,
ClassYPrice, ID, ElementNo, Carrier,
Farebase, Price, Totle, NotValidBefore,
NotValidAfter, Clazz, ClassEx,
ReturnClass, Code, FuelTax, AirportTax);
beanList.add(fdBean);
}
} catch (DocumentException e) {
e.printStackTrace();
logger.error(e.getMessage());
throw new DisplayedException(null, ErrorConstants.SYSTEM_ERROR_000, "解析FDDatasetBean出错"+e.getMessage());
}
return beanList;
}
djvfe 2011-08-17
  • 打赏
  • 举报
回复
b.jar里的实现类

package com.hb56.abe.vo;

import java.io.Serializable;

@SuppressWarnings("serial")
public class FDDatasetBean extends com.jj.flight.bean.FDDatasetBean implements Serializable {

private String from;
private String arrive;
private String date;
private String TPM;
private String classYPrice; //Y舱价格

private String id;
private String elementNo;
private String carrier;
private String farebase; //舱位
private String price; //单程价格
private String totle; //来回价格
private String notValidBefore; //生效开始时间
private String notValidAfter; //生效结束时间
private String clazz; //舱位
private String classEx;
private String returnClass; //返程舱位
private String code;
private String fuelTax; //燃油税
private String airportTax; //机场税

public FDDatasetBean() {
}

public FDDatasetBean(String from, String arrive, String date, String tpm,
String classYPrice, String id, String elementNo, String carrier,
String farebase, String price, String totle, String notValidBefore,
String notValidAfter, String clazz, String classEx,
String returnClass, String code, String fuelTax, String airportTax) {
super();
this.from = from;
this.arrive = arrive;
this.date = date;
TPM = tpm;
this.classYPrice = classYPrice;
this.id = id;
this.elementNo = elementNo;
this.carrier = carrier;
this.farebase = farebase;
this.price = price;
this.totle = totle;
this.notValidBefore = notValidBefore;
this.notValidAfter = notValidAfter;
this.clazz = clazz;
this.classEx = classEx;
this.returnClass = returnClass;
this.code = code;
this.fuelTax = fuelTax;
this.airportTax = airportTax;
}


public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getArrive() {
return arrive;
}
public void setArrive(String arrive) {
this.arrive = arrive;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getTPM() {
return TPM;
}
public void setTPM(String tpm) {
TPM = tpm;
}
public String getClassYPrice() {
return classYPrice;
}
public void setClassYPrice(String classYPrice) {
this.classYPrice = classYPrice;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getElementNo() {
return elementNo;
}
public void setElementNo(String elementNo) {
this.elementNo = elementNo;
}
public String getCarrier() {
return carrier;
}
public void setCarrier(String carrier) {
this.carrier = carrier;
}
public String getFarebase() {
return farebase;
}
public void setFarebase(String farebase) {
this.farebase = farebase;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getTotle() {
return totle;
}
public void setTotle(String totle) {
this.totle = totle;
}
public String getNotValidBefore() {
return notValidBefore;
}
public void setNotValidBefore(String notValidBefore) {
this.notValidBefore = notValidBefore;
}
public String getNotValidAfter() {
return notValidAfter;
}
public void setNotValidAfter(String notValidAfter) {
this.notValidAfter = notValidAfter;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
public String getClassEx() {
return classEx;
}
public void setClassEx(String classEx) {
this.classEx = classEx;
}
public String getReturnClass() {
return returnClass;
}
public void setReturnClass(String returnClass) {
this.returnClass = returnClass;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getFuelTax() {
return fuelTax;
}
public void setFuelTax(String fuelTax) {
this.fuelTax = fuelTax;
}
public String getAirportTax() {
return airportTax;
}
public void setAirportTax(String airportTax) {
this.airportTax = airportTax;
}

}

djvfe 2011-08-17
  • 打赏
  • 举报
回复
a.jar里的抽象类FDDatasetBean

package com.jj.flight.bean;

import java.io.Serializable;

public abstract class FDDatasetBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public abstract String getFrom();
public abstract void setFrom(String from);
public abstract String getArrive();
public abstract void setArrive(String arrive);
public abstract String getDate();
public abstract void setDate(String date);
public abstract String getTPM();
public abstract void setTPM(String tpm);
public abstract String getClassYPrice();
public abstract void setClassYPrice(String classYPrice);
public abstract String getId();
public abstract void setId(String id);
public abstract String getElementNo();
public abstract void setElementNo(String elementNo);
public abstract String getCarrier();
public abstract void setCarrier(String carrier);
public abstract String getFarebase();
public abstract void setFarebase(String farebase);
public abstract String getPrice();
public abstract void setPrice(String price);
public abstract String getTotle();
public abstract void setTotle(String totle);
public abstract String getNotValidBefore();
public abstract void setNotValidBefore(String notValidBefore);
public abstract String getNotValidAfter();
public abstract void setNotValidAfter(String notValidAfter);
public abstract String getClazz();
public abstract void setClazz(String clazz);
public abstract String getClassEx();
public abstract void setClassEx(String classEx);
public abstract String getReturnClass();
public abstract void setReturnClass(String returnClass);
public abstract String getCode();
public abstract void setCode(String code);
public abstract String getFuelTax();
public abstract void setFuelTax(String fuelTax);
public abstract String getAirportTax();
public abstract void setAirportTax(String airportTax);

}

djvfe 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 bawgiitx 的回复:]

用全称
把用到的所有FDDatasetBean
换成
com.hb56.abe.vo.FDDatasetBean

com.jj.flight.bean.FDDatasetBean
[/Quote]
试过了,还是一样不行的
djvfe 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 softroad 的回复:]

引用 25 楼 bawgiitx 的回复:

用全称
把用到的所有FDDatasetBean
换成
com.hb56.abe.vo.FDDatasetBean

com.jj.flight.bean.FDDatasetBean


com.hb56.abe.vo.FDDatasetBean cannot be cast to com.jj.flight.bean.FDDat……
[/Quote]
com.hb56.abe.vo.FDDatasetBean是继承com.jj.flight.bean.FDDatasetBean的啊
softroad 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 bawgiitx 的回复:]

用全称
把用到的所有FDDatasetBean
换成
com.hb56.abe.vo.FDDatasetBean

com.jj.flight.bean.FDDatasetBean
[/Quote]

com.hb56.abe.vo.FDDatasetBean cannot be cast to com.jj.flight.bean.FDDatasetBean
两个类名都不一样。
bawgiitx 2011-08-17
  • 打赏
  • 举报
回复
List<com.jj.flight.bean.FDDatasetBean> list = new ArrayList<com.jj.flight.bean.FDDatasetBean>();

com.jj.flight.bean.FDDatasetBean B = new com.hb56.abe.vo.FDDatasetBean();

list.add(B);
bawgiitx 2011-08-17
  • 打赏
  • 举报
回复
用全称
把用到的所有FDDatasetBean
换成
com.hb56.abe.vo.FDDatasetBean

com.jj.flight.bean.FDDatasetBean
djvfe 2011-08-17
  • 打赏
  • 举报
回复
大哥们帮帮忙啊
小赖赖 2011-08-16
  • 打赏
  • 举报
回复
怎么看都没问题啊
iambic 2011-08-16
  • 打赏
  • 举报
回复
外码->代码
iambic 2011-08-16
  • 打赏
  • 举报
回复
贴完整外码和编译出错信息。
djvfe 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 shuaizai88 的回复:]

lz是什么版本的jdk
[/Quote]
是1.6
24K純帥 2011-08-16
  • 打赏
  • 举报
回复
没有错的。。
luohuijun619 2011-08-16
  • 打赏
  • 举报
回复
没有错哦,向上转型不会有问题的
  • 打赏
  • 举报
回复
lz是什么版本的jdk
加载更多回复(11)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧