我有一个函数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);为什么?
发布于 2013-04-18 03:02:06
subList在List接口中定义,并返回一个List。如果您检查LinkedList中的实现,它实际上位于一个父类(AbstractList)中,您将看到它不返回LinkedList而是返回SubList,您的强制转换将抛出异常。
除非您使用特定于LinkedList的方法,否则解决此问题的最简单方法是将g更改为:
public static <T> void g(List<T> l) {发布于 2013-04-18 03:02:23
如果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。
发布于 2013-04-18 03:04:46
方法sublist是在由LinkedList实现的List接口中声明的。List接口中sublist方法的签名为:
List<E> subList(int fromIndex, int toIndex)因此,当您从LinkedList类调用此方法时,对象将为LinkedList,但该方法的返回类型为List,因此它将以List的形式给出。但是,您可以将变量强制转换为LinkedList并使用它。
https://stackoverflow.com/questions/16067933
复制相似问题