接受扩展对象的对象列表

时间:2014-07-08 12:05:54

标签: java arraylist

我们有一种方法可以接受List类型的RectangularShape

void foo(List<RectangularShape> recs) {
    // ...
}

我们创建ArrayList类型的Rectangle2D

ArrayList<Rectangle2D> rectangles = new ArrayList<Rectangle2D>();

然后我们尝试调用foo方法:

foo(rectangles);

首先,它不适用于List,但这不是我的主要问题。如果我将其更改为ArrayList,那么我认为它不适用于ArrayList<Rectangle2D>,但为什么不呢?由于Rectangle2D在我的逻辑中扩展RectangularShape,因此应该是可能的。

3 个答案:

答案 0 :(得分:2)

您正在寻找的是通用界限,如下所示:Is it possible to cast Map<Field, Value> to Map<Mirror, Mirror> when it is known that Field and Value extend Mirror?

有关如何使用通用边界的更多信息:Java generics and casting to a primitive type

基本上你需要使用通配符运算符

void foo(List<? extends RectangularShape> recs) {
  ...
}

或者使方法参数化,如下所示:

<E extends RectangularShape> void foo(List<E> recs) {
  ...
}

我个人更喜欢第二种方法。

答案 1 :(得分:0)

您需要声明您的方法:

void foo(List<? extends RectangularShape> l) {
    ... 
}

允许List(或List的任何子类)RectangularShape s(或RectangularShape的任何子类)的参数。

答案 2 :(得分:0)

void foo(List<? extends RectangularShape> recs) { // this method accept List 
                         of RectangularShape or it's sub types
}

所以你必须改变

ArrayList<Rectangle2D> rectangles = new ArrayList<Rectangle2D>();

进入

List<Rectangle2D> rectangles = new ArrayList<Rectangle2D>();

现在Rectangle2D extends RectangularShape这两种类型的List都会被foo()接受