爪哇力下传
我知道降级是不可行的。但我正在努力解决这个问题
这就是我所拥有的
public class Ticket{
public int number;
public String description;
}
public class MyTicket extends Ticket{
public String status;
}
但在我的应用程序中,我想使用MyTicket类,因为我不想强制更改原始Ticket对象。因此,当Ticket对象从调用(webservice、DB等)返回时,我尝试向下转换到MyTicket,但显然失败了
MyTicket mt=(MyTicket)ws.getTicket(1234);
所以我在想办法解决这个问题。我正在考虑编写一个“copyAttributes”方法,或者在MyTicket类的构造函数中复制属性,如下所示:
MyTicket mt=new MyTicket(ws.getTicket(1234));
public class MyTicket extends Ticket {
public String status;
public MyTicket(Ticket tckt){
//copy tckt attributes to MyTicket attributes
}
}
有没有办法获取一个类的属性并将它们设置到另一个类中? 还是有一种完全不同的方式让我沮丧而我却错过了
*解决方案:*因此我采用了下面的解决方案,并提出了这个解决方案。如果在转移发生之前未找到主票证,我需要更改以返回null:
public class MyTicket extends Ticket {
public String status;
public MyTicket(){}
public static MyTicket newInstance(Ticket tckt){
MyTicket mytkt=null;
if(tckt!=null){//copy tckt attributes to MyTicket attributes
BeanUtilsBean.getInstance().getConvertUtils().register(false,true,-1);
mytkt = new MyTicket();
BeanUtils.copyProperties(mytkt, tckt);
}
return mytkt;
}
}
# 1 楼答案
我建议您实现类似于可克隆的接口(但不是标准的Java接口,这里可以在您的超类中提供一个抽象方法)。在MyTicket课程中类似这样的内容:
# 2 楼答案
Downcasting仅当您知道引用实际上是子类类型时才应使用。似乎web服务返回的Ticket对象实际上不是MyTicket,因此向下广播将在运行时抛出
ClassCastException
在构造MyTicket时使用web服务返回的Ticket,我将在Ticket类中定义一个复制构造函数,它将获取一个Ticket对象并复制属性。这个复制构造函数将在MyTicket的构造函数中调用,该构造函数接受一个Ticket对象
# 3 楼答案
我认为你做得对。如果对象增长,您可能需要使用
Apache BeanUtils
来帮助您进行属性复制# 4 楼答案
在这种情况下,为什么不使用聚合+getter/setter呢
然后,您可以按照建议创建对象:
# 5 楼答案
如果你要取回的对象是作为一个Ticket对象而不是MyTicket创建的,那么我会按照你提出的复制构造函数的方式来处理它
# 6 楼答案
最好的方法是,用最少的冗余代码,让
MyTicket
包含原始Ticket
实例(聚合),并在需要时使用其属性,而无需事先复制任何内容如果需要通过getter公开所有属性,那么这将没有多大用处。只有在某些计算需要
Ticket
的内部属性时,它才有帮助