泛型如何影响可能的参数/返回类型

时间:2013-11-19 07:26:30

标签: java oop generics inheritance

我正在练习考试并提出以下问题:

考虑以下代码和继承层次结构:

public Deque<E> theMethod(E arg1, ArrayDeque<E> arg2)
{
return theOtherMethod(arg1, arg2);
}



D<|----E<|----F

Collection<|----------------------Deque<|----------------
    ^                               ^                   |
    |                               |                   |
    |                     |------ArrayDeque             |
    |                     |                             |
    |                     |                             |
    |                     |                             |
AbstractCollection<|------|                             |
                          |                             |
                          ----AbstractList<|----------LinkedList



Considering only the classes shown above:
(a) What types of objects can you supply to theMethod as arguments?
(b) What could the declared parameter types of theOtherMethod be?
(c) What could the declared return type of theOtherMethod be?

希望UML是可读的,&lt; |和^都表示继承。

我的答案如下,但我不确定它们是否正确,因为我不明白泛型如何影响可能的参数和返回类型。

(a) First param: E and F, second param only ArrayDeque
(b) First param: could be D or E, second param: could be Collection, Deque, ArrayDeque or AbstractCollection
(c) Collection or Deque

1 个答案:

答案 0 :(得分:1)

a: theMethod需要一个E类型的对象和一个由相同类型E组成的ArrayDeque。

因此,如果你要使用String for E,那么第二个参数应该是: ArrayDeque<String>。泛型是为了确保它们属于同一类型!

请注意,如果您的theMethod方法属于泛型类,则它应该与您在初始化期间传递给您的类的E相同:

public class Test<E> {
}

b:第一个参数必须是 E.第二个参数可以是:Deque<E> or ArrayDeque<E>.

c: theOtherMethod的返回类型可以是:

ArrayDeque, ConcurrentLinkedDeque, LinkedBlockingDeque, LinkedList

但在你的情况下,根据你的图表,它只能是:

ArrayDeque or LinkedList

因为他们都实现了Deque类。

如果您在使用泛型方面遇到问题,我还建议您阅读以下内容: http://docs.oracle.com/javase/tutorial/extra/generics/index.html