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{
}
我一直在读错误
线程“main”中的异常java.lang.RuntimeException:Uncompilable 源代码 - 错误的sym类型:java.util.List.ensureCapacity
答案 0 :(得分: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。
答案 1 :(得分:1)
List<T>
是一个接口,但它不包含ensureCapacity
的定义。这可以在ArrayList
和LinkedList<T>
中使用 - 因此您必须将bList
投射到ArrayList
以致电ensureCapacity
。
((ArrayList<B>) bList).ensureCapacity(listSize);
答案 2 :(得分:1)
IDE总是很好用,如果你使用任何IDE进行编程,时间是宝贵的肯定你会在这个bList.ensureCapacity(listSize);
行上得到一个红色标记,并带有一条消息,这将确保你有时间找到解决方案消息清楚地表明列表接口未定义ensureCapacity(int)
。
The method ensureCapacity(int) is undefined for the type List<B>
所以在List接口的实现中可以使用ensureCapacity(int)
方法,该接口是ArrayList,将此行(bList)bList.ensureCapacity(listSize)
转换为((ArrayList<B>) bList).ensureCapacity(listSize);
答案 3 :(得分:0)
如果要在List上调用ensureCapacity,则应将其声明为ArrayList而不是List。
一般来说,如果可以避免,就不应该进行施法。您应该声明变量尽可能通用,而不需要求助于转换。这并非总是可行,但在这种特殊情况下,没有理由不这样做。