有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

爪哇力下传

我知道降级是不可行的。但我正在努力解决这个问题

这就是我所拥有的

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;
    }
}

共 (6) 个答案

  1. # 1 楼答案

    我建议您实现类似于可克隆的接口(但不是标准的Java接口,这里可以在您的超类中提供一个抽象方法)。在MyTicket课程中类似这样的内容:

    @Override
    public Ticket clone() {
        // copying stuff by calling a "copy constructor"
        return new MyTicket(this);
    }
    
    private MyTicket(MyTicket t) {
    }
    
  2. # 2 楼答案

    Downcasting仅当您知道引用实际上是子类类型时才应使用。似乎web服务返回的Ticket对象实际上不是MyTicket,因此向下广播将在运行时抛出ClassCastException

    在构造MyTicket时使用web服务返回的Ticket,我将在Ticket类中定义一个复制构造函数,它将获取一个Ticket对象并复制属性。这个复制构造函数将在MyTicket的构造函数中调用,该构造函数接受一个Ticket对象

    public class Ticket{
       public int number;
       public String description;
    
       public Ticket(Ticket ticket)
       {
           this.number = ticket.number;
           this.description = ticket.description;
       }
    }
    
    public class MyTicket extends Ticket{
       public String status;
    
       public MyTicket(Ticket ticket)
       {
           super(ticket);
       }
    
       public MyTicket(Ticket ticket, String status)
       {
           super(ticket);
           this.status = status;
       }
    }
    
  3. # 3 楼答案

    我认为你做得对。如果对象增长,您可能需要使用Apache BeanUtils来帮助您进行属性复制

  4. # 4 楼答案

    在这种情况下,为什么不使用聚合+getter/setter呢

    public class MyTicket {
      private Ticket ticket;
      private String status;
    
      public MyTicket(Ticket ticket) {
        this.ticket = ticket;
      }
    
      public int getNumber() { return ticket.number; }
      public void setNumber(int number) { ticket.number = number; }
      public String getDescription { return ticket.description; }
      public void setDescription { ticket.description = description; }
      public String getStatus() { return status; }
      public void setStatus(String status) { this.status = status; }
    }
    

    然后,您可以按照建议创建对象:

    MyTicket mt = new MyTicket(ws.getTicket(1234));
    
  5. # 5 楼答案

    如果你要取回的对象是作为一个Ticket对象而不是MyTicket创建的,那么我会按照你提出的复制构造函数的方式来处理它

  6. # 6 楼答案

    最好的方法是,用最少的冗余代码,让MyTicket包含原始Ticket实例(聚合),并在需要时使用其属性,而无需事先复制任何内容

    public class MyTicket extends Ticket {
      private final Ticket t;
      public MyTicket(Ticket t) {
        this.t = t;
      }
    }
    

    如果需要通过getter公开所有属性,那么这将没有多大用处。只有在某些计算需要Ticket的内部属性时,它才有帮助