java - 为什么我们不能捕获具有两个参数的方法的通配符?

标签 java generics wildcard

that相关问题。

我知道通配符捕获。例如,以下可用于反转列表:

public static void reverse(List<?> list) { rev(list); } //capturing the wildcard
private static <T> void rev(List<T> list) {
    List<T> tmp = new ArrayList<T>(list);
    for (int i = 0; i < list.size(); i++) {
        list.set(i, tmp.get(list.size()-i-1));
    }
}

现在我正在尝试为这种情况写同样的东西:

private int compare (Comparable<?> upper, Comparable<?> lower){
    return comp(upper, lower);  //The method comp(Comparable<T>, Comparable<T>) is not applicable for the arguments (Comparable<capture#5-of ?>, Comparable<capture#6-of ?>)
}

private <T> int comp(Comparable<T> upper, Comparable<T> lower){
    return upper.compareTo((T) lower);
}

我希望它也编译得很好。是否可以通过这种方式捕获具有两个或更多参数的方法的通配符?

最佳答案

因为,正如我在回答您的另一个问题时所说,编译器无法知道这两个 ? 代表同一类型。

两个 ? 分别代表某种未知类型。 compare 方法需要两个相同类型 TComparable 对象。如果从 comp 方法中调用 compare,编译器无法确定这两个 ? 代表相同的类型。

关于java - 为什么我们不能捕获具有两个参数的方法的通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30703374/

相关文章:

java - 我是否需要检查 Spring 中每个 Controller 中的有效 session ?

java - Java List 在初始化期间是否表现为协变类型?

c# - 如何在不装箱/拆箱的情况下处理已知的通用类型

sql - MS Access Form - 文本框中的字符串,用于 LIKE 查询以过滤报告结果

java - 不评估 EL 表达式

java - 我可以向 JPanel 添加 ActionListener

java - 可以使用带有合理未使用代码的库吗?

Java - Enumerable.Cast() 像 C#?

ssl - 通配符 SSL 安装和 future 的子域

printing - 使用 bytes.replace 时有没有办法使用通配符?