方法参数不适用但它们是正确的

时间:2015-03-09 06:05:26

标签: java generics methods arguments

编辑:不确定这是否是正确的修复但由于某种原因添加扩展Comparable可以摆脱错误

我一直得到同样的错误。为什么呢?

我收到的错误是:

  

HeapSort类型中的方法maxHeapify(T [],int)不适用于参数(T [],int)

这是我的代码:

public class HeapSort {
    private static int parent(int i)
    {
        if(i % 2 == 0)
        {
            return((i-1)/2);
        }
        else
        {
            return(i/2);
        }
    }

    private static int leftChild(int i)
    {
        return(2*i + 1);
    }

    private static int rightChild(int i)
    {
        return(2*i + 2);
    }

    private static <T> void buildMaxHeap(T[] array)
    {
        int heapSize = array.length;

        for(int i = (heapSize/2 - 1); i >= 0; i--)
        {
            maxHeapify(array, i);
        }
    }

    private static <T extends Comparable<T>> void maxHeapify(T[] array, int i)
    {
        int L = leftChild(i);
        int R = rightChild(i);
        int Largest = (int) array[0];
        T temp;

        if(L <= array.length && array[R].compareTo(array[i]) > 0)
        {
            Largest = L;
        }
        else
        {
            Largest = i;
        }

        if(R <= array.length && array[R].compareTo(array[Largest]) > 0)
        {
            Largest = R;
        }

        if(Largest != i)
        {
            Swap(array[i], array[Largest]);
            maxHeapify(array, Largest);
        }
    }

    public static <T> void heapSort(T[] array)
    {
        buildMaxHeap(array);
        int heapSize = array.length;

        for(int i = array.length - 1; i >= 0; i--)
        {
            Swap(array[0], array[i]);
            heapSize = heapSize-1;
            maxHeapify(array, 0);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

错误的原因是因为此行以不同方式定义了

private static <T extends Comparable<T>> void maxHeapify(T[] array, int i)

到这个

private static <T> void buildMaxHeap(T[] array)

和这个

public static <T> void heapSort(T[] array)

它的

<T> 

vs

<T extends Comparable<T>> 

因为buildMaxHeap和heapSort都调用maxHeapify,所以你得到泛型类型不匹配

如果您将所有类型转换为

<T extends Comparable<T>>

然后这将解决该错误

修复此错误时,您还会遇到其他错误

int Largest = (int) array[0];

因为你的数组不包含int,它包含你的泛型类型对象