【问题标题】:Generic linked list - how to add different objects通用链表 - 如何添加不同的对象
【发布时间】:2015-02-05 14:46:38
【问题描述】:

我已经创建了一个链表,但我似乎无法理解如何将不同的对象插入到同一个列表中。假设我有一个列表,我想同时包含 cat 和 dog 类型的对象,这可能吗?我知道如何只插入猫或只插入狗,但我似乎不明白如何将两者插入同一个列表。

【问题讨论】:

    标签: java generics linked-list


    【解决方案1】:

    您想使用它们的“最低”通用类或通用接口,这样您就可以尽可能多地(以及您需要什么)了解列表的元素。

    如果DogCat 两个类扩展类 Animal,并且你想表示动物列表,你可以这样做:

    List<Animal> animals = new YourList<Animal>();
    for (Animal animal: animals){
        // use some Animal method
        animal.eat();
    }
    

    如果他们都实现了接口 TailOwner,并且您想从该接口对列表成员使用操作,您可以这样做:

    List<TailOwner> tailOwners = new YourList<TailOwner>();
    for (TailOwner tailOwner: tailOwners){
        // use some TailOwner method
        tailOwner.wiggle();
    }
    

    如果您不确定,可以随时退回到Object,因为所有 Java 类都扩展了它:

    List<Object> objects = new YourList<Object>();
    for (Object object: objects){
        // use some Object method
        System.out.println(tailOwner.toString());
    }
    

    通常,当您在同一个列表中有两个对象时,它们确实有一些共同点

    无论哪种方式,当您将任何Cat-specific 或Dog-specific 方法放入列表时,您都将放弃它们(在转换回任一方法之前)。

    当您使用列表中的对象时,具有良好的层次结构可以防止强制转换并促进多态性。关于在编译时从列表中检索到的对象,您所能知道的只是它们至少符合列表的泛型类型。

    【讨论】:

      【解决方案2】:

      如果CatDog 没有共同点,您可以将LinkedList 参数化为Object

      List<Object> list = new LinkedList<Object>();
      

      这样您就可以同时添加CatDog,但请注意,这可能会强制您在每次从列表中检索对象时检查类型。

      【讨论】:

        【解决方案3】:

        您只能添加implements相同接口或extends相同类的元素。

        class Animal {}
        
        class Cat extends Animal{}
        
        class Dog extends Animal{}
        
        List<Animal> animals = new LinkedList<Animal>;
        animals.add(new Cat());
        animals.add(new Dog());
        

        interface Animal {}
        
        class Cat implements Animal{}
        
        class Dog implements Animal{}
        
        List<Animal> animals = new LinkedList<Animal>;
        animals.add(new Cat());
        animals.add(new Dog());
        

        【讨论】:

          【解决方案4】:

          由于您的列表可能包含以某种方式相关的元素,因此最好创建一个接口并将其用作列表对象类型。

          从 IAnimal 派生 Cat 和 Dog 并制作类型列表

          List<IAnimal> animals = new YourList<IAnimal>();
          

          【讨论】:

            【解决方案5】:

            我会谨慎使用泛型这个词,尤其是因为猫和狗不是泛型。

            LinkedList<Object> linkedlist = new LinkedList<Object>();
            linkedList.add(new Dog());
            linkedList.add(new Cat());
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-05-26
              • 2013-09-30
              • 2013-02-23
              • 1970-01-01
              • 1970-01-01
              • 2019-05-05
              相关资源
              最近更新 更多