我有一个函数f
,它获取LinkedList
的子列表并将其传递给g
,这也需要一个LinkedList
:
public static <T> void g(LinkedList<T> l) {
}
public static <T> void f() {
LinkedList<T> l = new LinkedList<T>();
...
LinkedList<T> l2 = l.subList(i,j);
...
g(l2);
}
但这不会编译,因为显然LinkedList.subList
返回List
而不是LinkedList
.所以我必须把它改成这样:
LinkedList<T> l2 = (LinkedList<T>)l.subList(i,j);
为什么?
subList
在 List
接口中定义并返回一个 List
。如果你检查 LinkedList
中的实现,它实际上是在父类之一 ( AbstractList
(,你会看到它不返回LinkedList
而是返回SubList
,并且你的强制转换将抛出异常。
除非您使用特定于 LinkedList
的方法,否则解决此问题的最简单方法是将g
更改为:
public static <T> void g(List<T> l) {
如果 g(( 不使用 LinkedList 的方法,但只使用 List 接口更可取地定义 g((,如下所示:
public static <T> void g( List<T> l ) {
}
主要变成:
public static <T> void f() {
List<T> l = new LinkedList<T>();
...
List<T> l2 = l.subList(i,j);
...
g(l2);
}
有关理由,请参阅此帖子。
方法sublist
在由LinkedList
实现的List
接口中声明。List
接口中 sublist
方法的签名为:
List<E> subList(int fromIndex, int toIndex)
因此,每当从LinkedList
类调用此方法时,对象将是LinkedList
,但该方法的返回类型是List
,因此它将以List
的形式给出。但是,您可以将变量强制转换为LinkedList
并使用它。
您不能实例化"对象"这样的列表。List 是一个接口,而不是一个具体的类。接口只是一个类可以实现的一组函数;实例化接口没有任何意义。
希望对您有所帮助。
克莱门西奥·莫拉莱斯·卢卡斯。
Java 想要尽可能多的多态性,所以 subList 返回 List,你必须把它转换为你想要的。