int数组的通用交换方法

时间:2016-02-17 22:06:53

标签: java generics

我正在尝试创建一个简单的泛型方法来交换数组中的两个条目,但是当我调用该方法时,它会产生以下错误。我错过了什么?我确信这是一个简单的解决方案,我根本看不到它。

Sorting.java

package testing;

import java.util.Comparator;

public class Sorting {

    public static <T> void swap(T[] array, int left, int right){
        T temp = array[right];
        array[right] = array[left];
        array[left] = temp;
    }
}


SortTest.java

package testing;

import static testing.Sorting.*;

public class SortTest {

    public static void main(String[] args){

        int[] nums = {5, 12, 3, 7, 2};
        swap(nums, 0, 1);
    }
}

3 个答案:

答案 0 :(得分:2)

Java中没有办法制作允许接受基元的通用方法。您不能将int[]传递给期望T[]的方法,也不能对任何类型的基元进行任何通用方法。你可以使用像Integer[]这样的盒装数组,或者你可以自定义一个接受int[]的重载。

您还遇到 需要编写Sorting.swap(nums, 0, 1)而不仅仅是swap(nums, 0, 1)的问题,或者您需要将import static testing.Sorting.swap;写为import语句

答案 1 :(得分:1)

方法签名是通用的Object[],您无法指定int[]

int[] nums = {1};
Object[] o = nums; // doesn't compile

因此该方法不允许这样做。  您可以改为使用Integer[]

Integer[] nums = {5, 12, 3, 7, 2};

请注意,自动装箱不适用于数组,当泛型方法允许使用基元时,后台会有自动装箱。

泛型和基元类型不能很好地结合在一起。 (Java 10中的情况可能会好转)

答案 2 :(得分:0)

  1. swap方法是一个静态方法,虽然是一个特定于类的方法。要调用它,您需要className.methodinstanceOfClass.method(这将在编译时在class.method中翻译)
  2. Generic无法应用于基元:请参阅Why don't Java Generics support primitive types?