如何使用两种泛型类型创建类的实例?

时间:2017-03-10 19:29:56

标签: java generics types

我正在尝试创建一个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[][]

我不确定我做错了什么。如果有人可以提供帮助,我们将不胜感激!

4 个答案:

答案 0 :(得分:1)

ZipIterator<K[], V[]>Kint[]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的评论编辑我的答案