Java 为什么我可以将一个类的对象添加到另一个类的LinkedList?

Java 为什么我可以将一个类的对象添加到另一个类的LinkedList?,java,Java,我有一门课是这样的: public class One { private int idOne; private String nameOne; //Getter and Setter } 另一个类扩展了一个: public class Two extends One { private String moreThings; private String example; //Getter and Setter } 然后拥有LinkedList

我有一门课是这样的:

public class One {
    private int idOne;
    private String nameOne;
    //Getter and Setter
}
另一个类扩展了一个:

public class Two extends One {
    private String moreThings;
    private String example;
    //Getter and Setter
}
然后拥有
LinkedList myList=newLinkedList()

如果我指定列表将包含
One
对象
LinkedList
,我不明白为什么我可以向该列表添加
2个
对象。例如:

LinkedList<One> myList = new LinkedList<>();

Two t1 = new Two();
Two t2 = new Two();

myList.add(t1);
myList.add(t2);
LinkedList myList=新建LinkedList();
Two t1=新的Two();
Two t2=新的Two();
添加(t1);
添加(t2);

这很酷,但我不知道为什么我可以这么做。

这是因为
一个扩展了两个。这就是所谓的多态性

但是,您不能执行
List
操作,然后将
One
类型的对象添加到
Two
类型的列表中


类型为
two
的对象至少拥有
one
所拥有的一切,这就是它工作的原因。

请尝试使用类名
Animal
Cat
来代替
one
two


您声明您的列表应该包含
Animal
对象,因此它将接受
Cat
将您的问题作为一个真实世界的示例,让您拥有一个类
Animal
,具有
running()
eating()
drinking()等方法
等等。现在,您的类将看起来像

class Animal
{
  public void running()
  {
    //some code
  }

  public void eating()
  {
    //some code
  }

  public void drinking()
  {
    //some code
  }
}


让您有另外两个类
Dog
Cat
,因为它们是动物的类型,所以它们可以扩展
animal
类。 所以这样说是完全正确的

Animal animalObject=new Dog();  // a dog is a type of animal
or
Animal animalObject=new Cat();  //cat is a type of animal
or
Dog dogObject=new Dog();   //Nothing special
or
Cat catObject=new Cat();    //Nothing special
但是,以下内容无效

Dog dogObject=new Animal();
or
Cat catObject=new Animal();

因为(再读一遍那句话。)并给出一个……)

因为第二类是第一类的子集;这意味着每两个都是一个,但一个不一定是两个。参考前面的答案,猫(二)是动物(一)的一个子集

在您的例子中,您正在初始化对象1(动物)的链接列表,然后在其中添加对象2(Cat),这是有意义的,因为2(Cat)是1(动物)

但是如果你要走另一条路,例如;将一只(动物)添加到两只(猫)的链表中


它会给你一个错误。

因为它扩展了一个
。您确实编写了一个扩展的
,原因是什么?因为多态性。
Two
的每个实例也是
One
的一个实例。例如,如果你使用一个
链接列表
,这也会起作用。著名的名言“狗永远是一只动物,但你不能说动物永远是一只狗,就像这三个人说的那样。要了解更多有关此类关系的解释,建议您考虑现实世界中的对象,而不是抽象名称(“一”、“二”、“myList”等)。就像nobalG做的狗/动物类比一样,我希望你能扩展你的答案,因为“如果继续这样,我将不得不否决你。”