Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型和继承? publicstaticvoidmain(字符串…参数){ List list1=新的ArrayList(); 方法2(列表1); } 公共静态无效方法2(列表1){ }_Java_Generics - Fatal编程技术网

Java 泛型和继承? publicstaticvoidmain(字符串…参数){ List list1=新的ArrayList(); 方法2(列表1); } 公共静态无效方法2(列表1){ }

Java 泛型和继承? publicstaticvoidmain(字符串…参数){ List list1=新的ArrayList(); 方法2(列表1); } 公共静态无效方法2(列表1){ },java,generics,Java,Generics,我得到下面的编译错误 方法method2(列表)未定义 通过将列表1修改为列表可以解决上述问题这是一个非常常见的误解。子级扩展父级的事实不会使列表扩展列表。在这种情况下听起来很不直观,但确实如此。来自java教程: 给定两种具体类型A和B(例如,数字和整数), MyClass与MyClass没有关系,无论 A和B不相关。MyClass和 MyClass是一个对象 详情请阅读 至于添加到列表中,简短的回答是:假设您有另一个类Child2 extends Parent,现在,您在method2(li

我得到下面的编译错误

方法method2(列表)未定义


通过将
列表1
修改为
列表可以解决上述问题这是一个非常常见的误解。子级扩展父级的事实不会使
列表
扩展
列表
。在这种情况下听起来很不直观,但确实如此。来自java教程:

给定两种具体类型A和B(例如,数字和整数), MyClass与MyClass没有关系,无论 A和B不相关。MyClass和 MyClass是一个对象

详情请阅读

至于添加到列表中,简短的回答是:假设您有另一个
类Child2 extends Parent
,现在,您在
method2(list中作为参数接收的列表

列表

因此,我的问题是
List
是否可以作为参数传递给
List在阅读了更多内容后,这里是我自己的答案

我们不能将
列表分配给List
,因为
列表
意味着我们可以添加任何动物,如猫、狗 然而,
列表
意味着我们只能向其中添加狗/子类型,而不能添加猫。因此分配者会认为他只能获得狗/子类型 但是他也可以得到cat对象(因此运行时错误)

这是一个例子

public static void method2(List<? super Child> list1) {
//                                ^^^^^^^^^^^
    Child child1 = new Child();
    list1.add(child1);
}
psvm{
List list1=新的ArrayList();
列表1.添加(新狗());
method1(list1);//编译错误
}
公共静态无效方法1(列表1){
列表1.add(cat);//很好
列表1.添加(狗);//好
}
另一个常见的误解是关于上界泛型,它与


当我们说
列表时,请发布子类和父类的定义。请参阅PECS规则。您可以让一个类
Child2扩展父类
。如果允许,那么您可以将
Child
实例添加到
列表
。作为一个不相关的注意事项,每次看到
class Child扩展父类{},我都会开始抽搐
。孩子不应该是父母!!!。
父母=新孩子()
对于继承来说是一个毫无意义的类比。那是因为你是从生物学的角度来考虑孩子和父母,而不是从阶级关系的角度。事实上,他从来没有提到过孩子扩展了父母,而且每个人都理解这个问题,这一点很能说明问题。@DanielL。事实上,我经常看到父母/孩子专门用作生物学类比(参见我在Google的第一页上找到的例子)。此外,如果OP使用
class Gidget扩展Gadget{},我们会理解这个问题
。可能是任何东西。无论如何,我不是在批评这个问题。他自己这么说。他的问题是当你试图添加到列表中时会发生什么。第二个案例还显示编译时错误
…不适用于参数(Child2)
当然,它是完全对称的。我举了一个例子,说明为什么它会对这两个对象都失败,因为你不知道列表中的对象的实际类型,并不是说它对儿童有效。2实际上它非常令人困惑。看起来我不得不记下我不喜欢的方法。另一种解释方法是:你方法recE有一个参数“扩展父对象的对象列表”,不知道“对象”是什么。因此,您仅限于不需要知道的操作:列表属性、拾取元素并将其用作普通父对象指针等。另一方面,如果不知道“对象”应该是什么,则无法添加新的“对象”。
public static void method2(List<? extends Parent> list1) {
    Child child1 = new Child();
    list1.add(child1);
}
public static void method2(List<? extends Parent> list1) {
class Parent {}
class Mother extends Parent {}
class Father extends Parent {}

static void m(List<? extends Parent> parents) {
    parents.add(new Father());
}

List<Mother> mothers = new ArrayList<>();
m(mothers);
// throws 'ClassCastException: cannot cast Father to Mother'
Mother actuallyAFather = mothers.get(0);
public static void method2(List<? super Child> list1) {
//                                ^^^^^^^^^^^
    Child child1 = new Child();
    list1.add(child1);
}
psvm{
List<Dog> list1 = new ArrayList<Dog>();
list1.add(new Dog()); 
method1(list1);// compilation error
}

public static void method1(List<Animal> list1) {
list1.add(cat); // Good
list1.add(dog); // Good
}
psvm{
List<Dog> list1 = new ArrayList<Dog>();
list1.add(new Dog()); 
method1(list1);// good
}

public static void method1(List<? extends Animal> list1) {
list1.add(cat); // compilation error
list1.add(dog); // compilation error
}