我正在尝试创建一个ZipIterator类的实例,它将两个任意数组作为参数,并通过构造函数将它们设置为等于两个私有字段K []和V []。在我的测试类的主要方法中,我正在编写
import java.util.Iterator;
public class ZipIterator<K,V>
{
private K[] arr1;
private V[] arr2;
private int pos = 0;
public ZipIterator(K[] arr1, V[] arr2) {
this.arr1 = arr1;
this.arr2 = arr2;
}
}
在我的Testing类的main方法中,我正在尝试像这样创建一个ZipIterator对象
int[] arr1 = {1,5,3,1,6};
double[] arr2 = {2.3,42.1,1.6,6.43};
ZipIterator<int[],double[]> zip = new ZipIterator<int[],double[]>(arr1,arr2);
但我一直收到错误:
error: incompatible types: int[] cannot be converted to int[][]
我不确定我做错了什么。如果有人可以提供帮助,我们将不胜感激!
答案 0 :(得分:1)
当ZipIterator<K[], V[]>
为K
且int[]
为V
时,请考虑double[]
的签名。
您需要实例化的是ZipIterator<Integer, Double>
;您不能使用基本类型参数化类。
是的,因为装箱/拆箱而效率低下。如果您想要更高的性能,请创建将基本类型的数组保存为实例变量的包装类。但是,如果它具有很好的参数化,那将会非常棘手。
答案 1 :(得分:1)
仔细看看会发生什么:
您使用int[]
作为通用类型K
:
ZipIterator<int[], double[]> zip = new ZipIterator<int[],double[]>(arr1, arr2);
但是,您的构造函数正在接受K
数组,因此int[]
数组需要int[][]
:
public ZipIterator(K[] arr1, V[] arr2) { ... }
备注:强>
您不应该使用带有泛型的数组,而是使用List
接口:
public ZipIterator(List<K> arr1, List<V> arr2) { ... }
或者,与4castle mentioned一样,您甚至可以使用Iterable
界面。
与其他人所说的不同,数组总是一个对象,即使它是一个基本类型的数组。因此,int[]
使用K
完全有效,而int
则不然。
答案 2 :(得分:-1)
应该是
ZipIterator<int,double> zip = new ZipIterator<int,double>(arr1,arr2);
答案 3 :(得分:-1)
使用包装类
Integer[] arr1 = {1,5,3,1,6};
Double[] arr2 = {2.3,42.1,1.6,6.43};
ZipIterator<Integer,Double> zip = new ZipIterator<>(arr1,arr2);
根据@ 4castle的评论编辑我的答案