3
import java.util.*;
class A{
    public static void main(String[] args){
    }
    private List <B> bList;
    private Random generator = new Random();
    A(List<B> initialList){
        bList = new ArrayList<B> ();
        int listSize = initialList.size();
        bList.ensureCapacity(listSize);
             for (B b : initialList) {
             int bIndex = generator.nextInt(listSize);
             bList.add(bIndex , b);
        }
    }
}
class B{
}

我一直在阅读错误

线程“主”java.lang.RuntimeException 中的异常:无法编译的源代码 - 错误的符号类型:java.util.List.ensureCapacity

4

4 回答 4

2

ensureCapacity 不是 List 类型的方法。

是的,它是 ArrayList 的一个方法,但是引用 bList 是一个 List,您应该将其转换为 ArrayList 以使用该方法,如下所示:

((ArrayList<B>) bList).ensureCapacity(listSize);
         for (B b : initialList) {
         int bIndex = generator.nextInt(listSize);
         bList.add(bIndex , b);
    }

顺便说一句,在我的整个程序生命周期中,我从未直接调用 ArrayList 的方法 ensureCapacity。

于 2013-03-16T05:12:47.770 回答
1

IDE 总是很好,如果您使用任何 IDE 进行编程,时间是宝贵bList.ensureCapacity(listSize);ensureCapacity(int)界面。

The method ensureCapacity(int) is undefined for the type List<B>

所以ensureCapacity(int)方法在List接口的实现中是可用的,即ArrayList,将你的这条线(bList)bList.ensureCapacity(listSize)转换为((ArrayList<B>) bList).ensureCapacity(listSize);

于 2013-03-16T05:48:42.270 回答
1

List<T>是一个接口,但它不包含ensureCapacity. 这在ArrayListand LinkedList<T>- 中可用,因此您必须将 to 强制bList转换ArrayList为 call ensureCapacity

((ArrayList<B>) bList).ensureCapacity(listSize);
于 2013-03-16T05:19:45.437 回答
0

如果要在 List 上调用 ensureCapacity,则应将其声明为 ArrayList 而不是 List。

一般来说,如果可以避免,则永远不应该进行铸造。您应该将变量声明为尽可能通用,而无需求助于强制转换。这并不总是可能的,但在这种特殊情况下,没有理由不这样做。

于 2013-03-16T06:23:15.653 回答