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?
谢谢
这实际上并不特定于泛型,而是涉及类型。
简单的思考方式是, 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)
这是因为两者ArrayList都LinkedList实现了List接口,所以它们都可以作为Lists 来处理。
但是,以下行为是不允许的:
ArrayList arrayList = new LinkedList();
Run Code Online (Sandbox Code Playgroud)
虽然两者ArrayList都LinkedList实现List,但它们不是同一个类。它们在实现 的方法方面可能有相似之处List,但它们是完全独立的类。