我对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泛型,它们似乎非常难以理解.例如,这很好......
public class Main {
public static void main(String[] args) {
List<?> list = null;
method(list);
}
public static <T> void method(List<T> list) { }
}
Run Code Online (Sandbox Code Playgroud)
......这就是......
public class Main {
public static void main(String[] args) {
List<List<?>> list = null;
method(list);
}
public static <T> void method(List<T> list) { }
}
Run Code Online (Sandbox Code Playgroud)
... 还有这个 ...
public class Main {
public static void main(String[] args) {
List<List<List<?>>> list = null;
method(list);
}
public static <T> void method(List<List<T>> list) { }
} …Run Code Online (Sandbox Code Playgroud) 给出以下两个类定义:
class C1<T extends C1<T>> {}
class C2<U> extends C1<C2<U>> {}
Run Code Online (Sandbox Code Playgroud)
以下类型声明:
C1<C2<?>> a;
Run Code Online (Sandbox Code Playgroud)
直观地认为声明的类型a应该是有效的,但这不是JDK-8u45的行为方式.相反,我们得到类似以下输出:
Test.java:3: error: type argument C2<?> is not within bounds of type-variable T
C1<C2<?>> a;
^
where T is a type-variable:
T extends C1<T> declared in class C1
1 error
Run Code Online (Sandbox Code Playgroud)
(编辑:我在这里是一个dingus,这部分已经回答:C2<?> 没有延伸C1<C2<?>>.关于c下面声明的问题仍然是一个悬而未决的问题.)
但是C2<?> 确实延伸了C1<C2<?>>,这似乎很容易满足界限.到目前为止,对JLS的检查没有提供进一步的照明.它实际上应该只是满足子类型关系的约束,因为C2<?>它不是通配符类型,因此捕获转换只是对参数的标识转换.
在某些情况下,它变得不那么清晰,例如,采用以下类定义:
class C3<T extends C3<?>> {}
class C4<Y, Z> extends C3<C4<Z, Y>> {}
class …Run Code Online (Sandbox Code Playgroud)