我一直在努力让这段代码适合现阶段的感觉。它是为了计算一个范围内的素数,我写了一个方法来打印它们。不幸的是,代码不会编译,引用警告:
“warning:[unchecked] unchecked call to add(E)as raw type java.util.List”
- 我从谷歌搜索中了解到这个警告是因为没有声明你的erray中应该包含哪些类型的值,但我已经这样做了,而且当我尝试使用.add()时似乎只出现错误我的数组列表中的函数。
当我尝试运行它时会产生一些更可怕的错误 “静态错误:未定义的名称'PrimeNumbers'
我认为我在这一点上已经失去了密码,尽管有几次尝试都无法找出我做错了什么。
import java.util.*;
public class PrimeNumbers {
private List listOfPrimeNumbers; //add a member variable for the ArrayList
public static void main(String args []){
PrimeNumbers primeNumberList = new PrimeNumbers(50);
primeNumberList.print(); //use our new print method
}
public PrimeNumbers (int initialCapacity) {
listOfPrimeNumbers = new ArrayList<Integer>(initialCapacity/2); //initialCapacity/2 is an easy (if not tight) upper bound
long numberOfPrimes = 0; //Initialises variable numberOfPrimes to 0
int start = 2;
boolean[] isPrimeNumber = new boolean[initialCapacity + 1];
for (int i=0;i==initialCapacity;i++) {//setting all values in array of booleans to true
isPrimeNumber[i] = true;
}
while (start != initialCapacity)
{
if (isPrimeNumber[start])
{
listOfPrimeNumbers.add(start);
//add to array list
numberOfPrimes++;
for (int i = start; start < initialCapacity; i+=start)
{
isPrimeNumber[i] = false;
}
}
start++;
}
}
public void print() //add this printout function
{
int i = 1;
Iterator iterator = listOfPrimeNumbers.listIterator();
while (iterator.hasNext())
{
System.out.println("the " + i + "th prime is: " + iterator.next());
i++;
}
//or just System.out.println(listOfPrimeNumbers);, letting ArrayList's toString do the work. i think it will be in [a,b,c,..,z] format
}
public List getPrimes() {return listOfPrimeNumbers;} //a simple getter isnt a bad idea either, even though we arent using it yet
}
答案 0 :(得分:47)
更改此行
private List listOfPrimeNumbers; //add a member variable for the ArrayList
到
private List<Integer> listOfPrimeNumbers; //add a member variable for the ArrayList
这将消除警告。
奖励 - 您可能希望在print
方法中使用增强型for循环作为替代方法:
public void print() {
int i = 1;
for (Integer nextPrime:listOfPrimeNumbers) {
System.out.println("the " + i + "th prime is: " + nextPrime);
i++;
}
}
答案 1 :(得分:3)
您已将primeNumbers decalred为无类型List,但随后创建了一个Integer的ArrayList。将primeNumbers的声明更改为:
private List<Integer> listOfPrimeNumbers;
用于将所有isPrimeNumber设置为true的for循环不起作用,条件应为i<=initialCapacity
或甚至更好用:
Arrays.fill(isPrimeNumber, true);
在你的打印方法中,我不打算使用迭代器并跟踪int i,只需使用普通for循环。
在不知道用于构建代码的命令然后尝试运行它的情况下,很难诊断出运行时错误。确保您的命令窗口与.class文件位于同一目录中。