我对Java泛型如何处理继承/多态性感到困惑.
假设以下层次结构 -
动物(父母)
狗 - 猫(儿童)
所以假设我有一个方法doSomething(List<Animal> animals).根据所有继承和多态的规则,我会假设a List<Dog> 是 a List<Animal>而a List<Cat> 是 a List<Animal>- 所以任何一个都可以传递给这个方法.不是这样.如果我想实现这种行为,我必须明确告诉该方法接受一个Animal的任何子类的列表doSomething(List<? extends Animal> animals).
我知道这是Java的行为.我的问题是为什么?为什么多态通常是隐含的,但是当涉及泛型时必须指定它?
为什么以下代码在Java中是错误的?
List<List<Integer>> list = new ArrayList<ArrayList<Integer>>();
Run Code Online (Sandbox Code Playgroud)
我知道List<List<Integer>> list = new ArrayList<List<Integer>>()是正确的。
我的问题是我有两个班级:父母和孩子。
父类是abstract,子类从它们扩展而来。
然后我有一个返回父级的方法,ArrayList我需要将它转换 ArrayList为子级。
我该做什么?
另一个例子非常复杂,我根本不理解它,我的问题在某种程度上是相似的,但正如我所说的那样更简单,可能会在更简单的答案中产生
public List<? extends Parent> myfunction(List<? extends Parent> mylist){
mylist.add(new Child()) ; //Doesn't Compile
}
Run Code Online (Sandbox Code Playgroud) 如果有人可以在这里指出问题和可能的解释,那将是非常有帮助的.
class Parent{}
public class ChildClass extends Parent{
/*Main class*/
public static void main(String[] args) {
ArrayList<ChildClass> a3 = new ArrayList<ChildClass>();
foo(a3);
}
/*another function*/
static void foo(ArrayList<Parent> obj) {
}
Run Code Online (Sandbox Code Playgroud)
这会引发以下编译错误.
The method foo(ArrayList<Parent>) in the type ChildClass is not applicable for the arguments (ArrayList<ChildClass>)
Run Code Online (Sandbox Code Playgroud)
多态的规则应该允许我这样做.对?在所有ChildClass IS-A Parent之后.什么似乎是问题?
java ×5
arraylist ×2
generics ×2
inheritance ×2
list ×2
polymorphism ×2
abstract ×1
casting ×1
collections ×1
oop ×1