【问题标题】:Java Generics - inferred type does not conform to equality constraint(s)Java 泛型 - 推断类型不符合等式约束
【发布时间】:2018-03-22 06:23:14
【问题描述】:

我正在阅读 Java 泛型并了解类型参数界限。在下面的代码中,我无法理解为什么编译器会报告第 38 行的错误而不是第 41 行。

如果我将 sort() 方法的类型参数边界更改为 <T extends Comparable<? super T>>,那么这两个调用都有效。

import java.util.Collections;
import java.util.List;

class Person implements Comparable<Person> {
    @Override
    public int compareTo(Person o) {
        return 0;
    }
}

class Student extends Person {}

/* ------------------------------------------ */

class Player<T extends Player<T>> implements Comparable<T> {
    @Override
    public int compareTo(T o) {
        return 0;
    }
}

class Goalkeeper extends Player<Goalkeeper> {
    @Override
    public int compareTo(Goalkeeper o) {
        return 1;
    }
}

/* ------------------------------------------ */

public class ComparableTest {
    private static <T extends Comparable<T>> void sort(List<T> list) {
        list.sort(null);
    }

    public static void main(String[] args) {
        List<Student> students = Collections.emptyList();
        //! sort(students); // inferred type does not conform to equality constraint(s)

        List<Goalkeeper> goalkeepers = Collections.emptyList();
        sort(goalkeepers); // why ok?
    }
}

【问题讨论】:

  • 为我编译...更新 IDE 是我唯一的建议...
  • @Ran 你需要取消注释 //sort(students);
  • 仍在编译...

标签: java generics contravariance


【解决方案1】:

studentsList&lt;Student&gt;,所以sort(List&lt;T&gt; list) 意味着TStudent

但是,Student 没有实现 Comparable&lt;Student&gt;,因此违反了约束 &lt;T extends Comparable&lt;T&gt;&gt;

goalkeepersList&lt;Goalkeeper&gt;,所以TGoalkeeper,而Goalkeeper 确实实现了Comparable&lt;Goalkeeper&gt;,所以一切都很好。

【讨论】:

    猜你喜欢
    • 2017-11-03
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多