【问题标题】:Java generics: Wildcard capture compilation errorJava泛型:通配符捕获编译错误
【发布时间】:2012-09-19 20:29:22
【问题描述】:

我收到以下编译错误:

The method sort(List<T>, Comparator<? super T>) in the type Collections is not applicable for the arguments (T[], Comparator<capture#1-of ? extends T>) Main.java   /Sorting/src/com/kash/test  line 11
The method sort(List<T>, Comparator<? super T>) in the type Collections is not applicable for the arguments (T[], Comparator<capture#2-of ? super T>)   Main.java   /Sorting/src/com/kash/test  line 15
The method sort(List<T>, Comparator<? super T>) in the type Collections is not applicable for the arguments (T[], Comparator<T>)    Main.java   /Sorting/src/com/kash/test  line 19

当我编译(在 Eclipse Juno 中使用 JDK 1.7.0)此代码时:

package com.kash.test;

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

// 3 attempts to write a wrapper over: Collections' method
//      public static <T> void sort(List<T> list, Comparator<? super T> c)
public class Main {

    public static <T> void sort1(T[] array, Comparator<? extends T> c) {
        Collections.sort(array, c); // line 11
    }

    public static <T> void sort2(T[] array, Comparator<? super T> c) {
        Collections.sort(array, c); // line 15
    }

    public static <T> void sort3(T[] array, Comparator<T> c) {
        Collections.sort(array, c); // line 19
    }

    public static void main(String[] args) {

    }
}

我已阅读以下内容,但并不太了解。有什么帮助吗?

-- 编辑--

对于那些想知道我为什么做这么愚蠢的事情的挑剔的人。如果你不在乎我为什么要这样做,那就别打扰其他人了。

为什么?

我正在编写以下接口的几个实现(例如 Quick、Insertion、Heap、Mixed、Intro、Bubble...):

package com.kash.src;

import java.util.Comparator;
import java.util.List;

/**
 * Interface that provides all sorting functions for all possible representations of a list of Objects (non-primitive
 * types). <br>
 * - {@link List}<{@link Comparable}><br>
 * - Array of < ? extends {@link Comparable}><br>
 * - {@link List}< ? > with external {@link Comparator}<br>
 * - Array of < ? > with external {@link Comparator}<br>
 * 
 * @author Kashyap Bhatt
 * 
 */

public interface Sorter {
    <T extends Comparable<T>> void sort(List<T> list);

    <T extends Comparable<T>> void sort(T[] array);

    <T extends Object> void sort(List<T> list, Comparator<? super T> c);

    <T extends Object> void sort(T[] array, Comparator<? super T> c);
}

这样我就可以测试我所有的排序实现并测试它们。我想将结果与 Java 的排序实现进行比较,所以我也在编写这个接口的实现,它在内部只调用 Java 的排序方法。这就是我遇到问题的地方。

【问题讨论】:

    标签: java templates generics compiler-errors


    【解决方案1】:

    Collections.sort() 不对数组进行排序,而是Lists。

    【讨论】:

    • 谢谢。愚蠢的我。 :) 我应该在这个包装器中调用 Arrays.sort()。
    【解决方案2】:

    Collections#sort 在传递数组时需要 List
    做:

    public static <T> void sort1(T[] array, Comparator<? extends T> c) {
            Collections.sort(Arrays.asList(array), c); // line 11
    }
    

    【讨论】:

    • 谢谢。愚蠢的我。 :) 我应该在这个包装器中调用 Arrays.sort()。
    【解决方案3】:

    Collections 类型中的方法sort(List&lt;T&gt;, Comparator&lt;? super T&gt;) 不适用于参数(T[], Comparator&lt;capture#1-of ? extends T&gt;) Main.java /Sorting/src/com/kash/test 第11行

    您正在传递T[],其中应该是List&lt;T&gt;,而Comparator&lt;? extends T&gt; 应该是Comparator&lt;? super T&gt;

    为什么你认为它不应该报错?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多