我们有一种方法可以接受List
类型的RectangularShape
。
void foo(List<RectangularShape> recs) {
// ...
}
我们创建ArrayList
类型的Rectangle2D
。
ArrayList<Rectangle2D> rectangles = new ArrayList<Rectangle2D>();
然后我们尝试调用foo方法:
foo(rectangles);
首先,它不适用于List
,但这不是我的主要问题。如果我将其更改为ArrayList
,那么我认为它不适用于ArrayList<Rectangle2D>
,但为什么不呢?由于Rectangle2D
在我的逻辑中扩展RectangularShape
,因此应该是可能的。
答案 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()
接受