Java 泛型 - 推断类型不符合等式约束
Java Generics - inferred type does not conform to equality constraint(s)
我正在研究 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?
}
}
students
是 List<Student>
,所以 sort(List<T> list)
意味着 T
是 Student
。
但是,Student
没有实现 Comparable<Student>
,因此违反了约束 <T extends Comparable<T>>
。
goalkeepers
是 List<Goalkeeper>
,所以 T
是 Goalkeeper
,Goalkeeper
是否 实现 Comparable<Goalkeeper>
,所以一切都很好。
我正在研究 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?
}
}
students
是 List<Student>
,所以 sort(List<T> list)
意味着 T
是 Student
。
但是,Student
没有实现 Comparable<Student>
,因此违反了约束 <T extends Comparable<T>>
。
goalkeepers
是 List<Goalkeeper>
,所以 T
是 Goalkeeper
,Goalkeeper
是否 实现 Comparable<Goalkeeper>
,所以一切都很好。