Java 泛型和继承? publicstaticvoidmain(字符串…参数){ List list1=新的ArrayList(); 方法2(列表1); } 公共静态无效方法2(列表1){ }
我得到下面的编译错误 方法method2(列表)未定义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
通过将
列表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
}