Java多态性混乱

msh*_*rma 8 java polymorphism types

下面的问题来自Kathy Sierra和Bert Bates的Java SCJP5一书.给定一个声明为的方法:

public static <E extends Number> List<E> process(List<E> nums)
Run Code Online (Sandbox Code Playgroud)

程序员想要使用这样的方法:

// INSERT DECLARATIONS HERE
output = process(input);
Run Code Online (Sandbox Code Playgroud)

可以在// INSERT DECLARATIONS这里放置哪一对声明以允许代码编译?(选择所有适用的选项.)

一个.

ArrayList<Integer> input = null;
ArrayList<Integer> output = null;
Run Code Online (Sandbox Code Playgroud)

B.

ArrayList<Integer> input = null;
List<Integer> output = null;
Run Code Online (Sandbox Code Playgroud)

C.

ArrayList<Integer> input = null;
List<Number> output = null;
Run Code Online (Sandbox Code Playgroud)

D.

List<Number> input = null;
ArrayList<Integer> output = null;
Run Code Online (Sandbox Code Playgroud)

E.

List<Number> input = null;
List<Number> output = null;
Run Code Online (Sandbox Code Playgroud)

F.

List<Integer> input = null;
List<Integer> output = null;
Run Code Online (Sandbox Code Playgroud)

G.以上都不是.

给出的正确答案是:B,E,F和书中的解释说明:
"返回类型肯定被声明为List,而不是ArrayList所以A,D是错误的......."

这是我没有得到的......为什么返回类型必须只是List而不是ArrayList?就像参数可以是ArrayList那么为什么cant返回类型也是arrayList?

谢谢

sta*_*lue 13

因为ArrayList是List的子类,所以进程返回的List不保证是ArrayList.例如,它可能是LinkedList.


coo*_*ird 3

这实际上并不特定于泛型,而是涉及类型。

简单的思考方式是, anArrayList是 a List,但 anList不一定是 an ArrayList

ArrayList实现了该List接口,因此可以将其视为List. 然而,仅仅因为某些东西实现了List,它就不是一个ArrayList. 例如,LinkedList实现List,但不是ArrayList

例如,允许以下内容:

List arrayList = new ArrayList();
List linkedList = new LinkedList();
Run Code Online (Sandbox Code Playgroud)

这是因为两者ArrayListLinkedList实现了List接口,所以它们都可以作为Lists 来处理。

但是,以下行为是不允许的:

ArrayList arrayList = new LinkedList();
Run Code Online (Sandbox Code Playgroud)

虽然两者ArrayListLinkedList实现List,但它们不是同一个类。它们在实现 的方法方面可能有相似之处List,但它们是完全独立的类。