我有一个函数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);
为什么?
答案 0 :(得分:5)
subList
在List
界面中定义,并返回List
。如果您检查LinkedList
中实际位于其中一个父类(AbstractList
)中的实现,您会看到它不返回{{1}但是LinkedList
并且你的演员会抛出异常。
除非您使用特定于SubList
的方法,否则解决此问题的最简单方法是将LinkedList
更改为:
g
答案 1 :(得分:0)
如果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);
}
为了证明理由,please consult this post。
答案 2 :(得分:0)
方法sublist
在List
接口中声明,由LinkedList
实现。 sublist
接口中List
方法的签名是:
List<E> subList(int fromIndex, int toIndex)
因此,每当您从LinkedList
类调用此方法时,该对象将为LinkedList
,但该方法的返回类型为List
,因此它将以表单形式给出List
。但是,您可以将变量强制转换为LinkedList
并使用它。
答案 3 :(得分:0)
您无法实例化对象&#39;这样的清单。 List是一个接口,而不是具体的类。 接口只是一个类可以实现的一组函数;实例化一个接口没有任何意义。
希望它有所帮助。
Clemencio Morales Lucas。
答案 4 :(得分:-1)
Java需要尽可能多的多态性,因此subList返回List,你必须将它转换为你想要的。