JAVA - 强制在自己的对象中强制转换对象以应用方法

时间:2015-03-04 09:46:26

标签: java

我有一个班级collection<T> extends ArrayList() 对象lesCommandes是多个Commandes的集合 我从其中的Commandes类中存储了3个对象,当我想将方法​​应用于其中一个this.lesCommandes.get(1).xmlCommande()时,我需要投射它或它不起作用((Commande)this.lesCommandes.get(1)).xmlCommande()

class Collection<T> extends ArrayList{}

this.commande1=new Commande(1,10,"filet 1kg",1,"10-12-2015","10-01-2016","en cours");
this.commande2=new Commande(2,15,"filet 5kg",1,"11-11-2015","10-02-2016","livrée");
this.commande3=new Commande(3,20,"caisse 10kg",2,"12-10-2015","10-03-2016","livrée");
this.lesCommandes.add(0, commande1);
this.lesCommandes.add(1, commande2);
this.lesCommandes.add(2, commande3);
xml=((Commande)this.lesCommandes.get(1)).xmlCommande();

2 个答案:

答案 0 :(得分:1)

您必须扩展ArrayList<Commande>,因此存储在其中的对象将保持Commande类型

答案 1 :(得分:0)

首先提出一些关于设计的建议(如果可以的话)。

请勿对 撰写 使用 继承 extends表示是一种关系,经常被滥用:您可以说GroupOfOrders ListOfOrders并定义以下内容(在这种情况下,它实际上意味着是以)实现的:

public GroupOfOrders extends List<Order> {...}

但是,通常最好根据组合来定义这种关系,并使用List<T>来实现(隐藏)。 为什么? - 因为,

  1. 您可能希望拥有GroupOfOrders的层次结构,而且您只能extends一次,
  2. 当您extends从超类继承 all 公共受保护成员和受保护成员时。在您的情况下,这些方法不是(功能)域的一部分。您可能不希望允许您班级的客户应用List<T>中的任何方法。
  3. 如果您决定更改实施并说GroupOfOrders实际上更好地使用Set<T>实施,则意味着您不会将重复的Order授权为GroupOfOrders如果扩展'List . It can be very difficult if you extends List`,客户端类在整个代码中使用方法,你可以轻松地做到这一点 - 如果有< em>外部客户端,您无法控制您的类的代码和用法。
  4. 仅举例来说,我定义了Order类(英语中的 commande order - 这只是与人分享的问题,我不知道t表示你需要翻译代码)

    public class Order {
       // properties, constructor...
    
       public OrderResult executeOrder() {
          // just do it
       }
       public String asXML() {
          // generate the order as an XML string
       }
    }    
    
    public class GroupOfOrders {
       private List<Order> orders = new ArrayList<>();
    
       public void addOrder(Order o) {
          // do some checking on order
          orders.add(order);
       }
    
       public GroupedOrderResult executeAllOrders() {
          GroupedOrderResult result = new GroupedOrderResult();
          for (Commande c : commandes) {
             OrderResult res = c.executeOrder();
             result.add(c, res);
          }
          return result;
       }
    
       List<Order> getOrders() { return orders; }
    }
    

    也许,在程序的其他地方,当你需要将每个订单作为XML字符串时:

    GroupOfOrders orders; // initialised with the different orders
    for (Order o : orders.getOrders()) {
       String xmlOrder = o.asXML();
       // do what needs to be done with xmlOrder
    }
    

    你会注意到没有必要施放。


    其次,对您提供的代码提出一些意见:

    class Collection<T> extends ArrayList{}
    

    这没有意义:ArrayList已经实现了Collection接口。可能是你的意思

    List<T> lesCommandes = new ArrayList<Commande>();
    
    this.commande1=new Commande(1,10,"filet 1kg",1,"10-12-2015","10-01-2016","en cours");
    this.commande2=new Commande(2,15,"filet 5kg",1,"11-11-2015","10-02-2016","livrée");
    this.commande3=new Commande(3,20,"caisse 10kg",2,"12-10-2015","10-03-2016","livrée");
    this.lesCommandes.add(0, commande1);
    this.lesCommandes.add(1, commande2);
    this.lesCommandes.add(2, commande3);
    

    只做

    lesCommandes.add(commande1); etc..
    

    List<T>$add(T)实际上会在列表末尾添加并动态管理大小。

      

    XML =((COMMANDE)this.lesCommandes.get(1))xmlCommande();

    如果按照我的建议定义了lesCommandes并且xmlCommande()类中有Commande方法,那么就这样做

    xml = lesCommandes.get(1).xmlCommande();