代码之家  ›  专栏  ›  技术社区  ›  Ravi

Java泛型-推断类型不符合等式约束

  •  -1
  • Ravi  · 技术社区  · 7 年前

    我正在学习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?
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Andreas dfa    7 年前

    students 是一个 List<Student> ,所以使用 sort(List<T> list) 这意味着 T Student

    然而 大学生 未实现 Comparable<Student> ,因此约束 <T extends Comparable<T>> 违反了。

    goalkeepers 是一个 List<Goalkeeper> 所以 T Goalkeeper 守门员 使生效 Comparable<Goalkeeper> ,所以一切都很好。