使用java中的泛型对数组进行排序时出现编译时错误

时间:2015-04-28 14:59:38

标签: java

这是我的代码:

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

public class SortingUsingGenerics {

    public static void main(String[] args) {
        Integer[] intArray = {1,5,4,2,10};
        String[] stringArray = {"Ä","X","C","B","M"};
        Float[] floatArray = {1.5f,2.8f,0.5f,10.3f,9.5f};

        // Sort and Print
        printArray(sortArray(intArray));
        printArray(sortArray(stringArray));
        printArray(sortArray(floatArray));

    }

    private static <MyArray> void printArray(MyArray[] inputArray) {
        for (MyArray element : inputArray) {
            System.out.print(element);
        }
        System.out.println();
    }

    public static <E> E[] sortArray(E[] inputArray){

        if (inputArray instanceof Integer[]){
            Collections.sort(Arrays.asList(inputArray),new Comparator<Integer>() {
                        public int compare(Integer o1, Integer o2) {
                            if (o1 == o2) {
                                return 0;
                            } else if (o1 > 02) {
                                return 1;
                            } else {
                                return -1;
                            }
                        }

                    });
        }
        return inputArray;
    }
}

我得到的错误是:

  

类型集合中的方法sort(List<T>, Comparator<? super T>)不适用于参数(List<E>, new Comparator<Integer>(){})

请你解释一下我在这里做错了什么?

2 个答案:

答案 0 :(得分:7)

您的instanceof检查并没有真正告诉编译器inputArrayInteger[] - 编译时类型仍然只是E[]

但是,您可以非常轻松地进行投射,此时它可以正常工作:

if (inputArray instanceof Integer[]) {
    Integer[] integers = (Integer[]) inputArray;
    Collections.sort(Arrays.asList(integers), ...);
}

甚至只是:

if (inputArray instanceof Integer[]) {
    Collections.sort(Arrays.asList((Integer[]) inputArray), ...);
}

但是,当你有一个泛型方法然后为特定类型做特定的事情时,你至少应该考虑你是否真的想要一个泛型方法。

答案 1 :(得分:3)

在这种情况下,根据数组是Integer[]Float[]还是String[]来决定做什么没什么价值 - 全部它们实现了Comparable接口。由于该方法不允许,因此对不是 Comparable的任何内容进行排序都没有意义 - 我们不允许用于传递可解决此问题的自定义Comparator

在这种情况下,最理想的是你依靠Comparable的自然行为而不是手写的比较方法。

public static <E extends Comparable<E>> E[] sortArray(E[] inputArray){
    Collections.sort(Arrays.asList(inputArray), new Comparator<E>() {
        @Override
        public int compare(E o1, E o2) {
            return o1.compareTo(o2);
        }

    });
    return inputArray;
}

这种方法可以确保无论您传递的E是什么,它还是Comparable,因此您可以简单地委托每个对象的compareTo方法,同时保留匿名Comparator上所需的类型绑定。