【问题标题】:Method arguments not applicable but they are correct方法参数不适用,但它们是正确的
【发布时间】:2015-03-09 06:05:26
【问题描述】:

编辑:不确定这是否是一个正确的修复,但由于某种原因添加 extends 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);
        }
    }
}

【问题讨论】:

    标签: java generics methods arguments


    【解决方案1】:

    错误的原因是因为这一行对T的定义不同

    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> 
    

    对比

    <T extends Comparable<T>> 
    

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

    如果将所有类型转换为

    <T extends Comparable<T>>
    

    然后这将修复该错误

    修复此问题时,您还会遇到另一个错误

    int Largest = (int) array[0];
    

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

    【讨论】:

    • 我从字面上理解了这一点,一旦我在您的回复中进行编辑,就会出现大声笑。但谢谢。然而,在修复它之后,我没有得到你所说的 int 转换错误,我知道它们不是 int 但它在没有转换的情况下有一个错误,所以我现在把它留在那里。当我将最大变量更改为 T 时,由于 L 和 R 是整数而出现错误,我无法将它们与泛型类型进行比较
    • 编辑:不知道为什么我把它设为最大 = 数组 [0],它只需要是索引而不是实际对象。已修复所有错误!
    猜你喜欢
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多