获取不兼容的类型和数组所需的错误

时间:2016-09-08 15:33:03

标签: java list error-handling

我正在努力让读数成为此代码工作的正确类型。我无法弄清楚如何克服这个错误。 There is a bug associated with it,但我不确定这是否与我相关。

List<String> readings = new ArrayList<String>();
Matcher m = Pattern.compile("\\d{3}").matcher(s);
while (m.find()) {
    readings.add(m.group());
}
readings = readings.toArray(new String[0]);
for (int i = 0; i < numberOfElectrodes; i++) {
    packet[i] = Integer.parseInt(readings[i]);

}

显示错误:

  

错误:(313,44)java:不兼容的类型:没有类型的实例   变量T存在,以便T []符合java.util.List

     

错误:(322,58)java:数组必需,但找到了java.util.List

3 个答案:

答案 0 :(得分:3)

问题在于:

readings = readings.toArray(new String[0]);

变量readings之前被声明为:

List<String> readings = ...;

它的类型是List<String>

toArray返回的类型为String[]String[]未实现List<String>,因此您无法将toArray的结果分配给readings

你能做的是;声明一个类型为String[]的新变量:

String[] readingsArray = readings.toArray(new String[0]);

然后在下面的for循环中引用该变量:

for (int i = 0; i < numberOfElectrodes; i++) {
    packet[i] = Integer.parseInt(readingsArray[i]); // <--

或者,您可以跳过创建String[],并使用增强的for循环:

// readings = readings.toArray(new String[0]);
for (String element : readings) { // For each string in 'readings'
    packet[i] = Integer.parseInt(element);

答案 1 :(得分:1)

  1. readings = readings.toArray(new String[0]);

    由于readings是一个列表,因此无法为其分配数组。

  2. 再次

    packet[i] = Integer.parseInt(readings[i]);
    

    readings不是数组,要从列表中获取元素,您必须使用get()。因此它应该是:

    packet[i] = Integer.parseInt(readings.get(i));
    

答案 2 :(得分:0)

您可能熟悉Python或Ruby等语言,其中变量可以保存任何类型的对象,甚至可以在程序执行的不同点保存不同类型的对象。然而,Java是声明变量类型的语言之一,它们永远不会改变。

在您的计划中,readings的类型为List<String>

               List<String> readings = new ArrayList<String>();

List.toArray()的返回值是一个数组。数组不是List,否则对该方法没有多大意义。在第313行,编译器抱怨您无法将数组分配给List类型的变量。关于类型变量的一点是红鲱鱼。

类似适用于第322行:由于readingsList,因此您无法将数组索引运算符应用于它。但是,您可以使用List.get(int)方法。

至少有两种可能的解决方案。如果由于某些原因在您发布的代码中不明显,您需要使用与String具有相同元素的readings数组,然后您可以创建一个。例如:

String[] readingsArray = readings.toArray(new String[0]);

然后你可以稍后再做

packet[i] = Integer.parseInt(readingsArray[i]);

另一方面,如果你不特别需要一个数组(我判断的可能性更大),那么你可以完全删除第313行,然后在第322行删除

packet[i] = Integer.parseInt(readings.get(i));