如何在Java泛型中指定T实现Comparable<T>解决sort调用报错
解决方案
错误原因
ListFunctions.sort方法要求入参List的元素类型必须实现Comparable<T>接口,但你定义的MyArray<T>类没有对泛型参数T做任何约束,编译器无法确认myList的元素类型满足排序方法的要求,因此抛出找不到对应方法的错误。
修改步骤
- 给
MyArray的泛型参数添加上限约束,要求T必须实现Comparable<T>接口:
// 修改前 class MyArray<T> { // 修改后 class MyArray<T extends Comparable<T>> {
- 实例化
MyArray时明确指定泛型类型,避免使用原始类型丢失泛型信息:
// 修改前 MyArray arr = new MyArray(); // 修改后 MyArray<String> arr = new MyArray<>();
修改后完整可运行代码
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class MyClass { public static void main(String args[]) { MyArray<String> arr = new MyArray<>(); arr.set("b"); arr.set("a"); arr.sort(); } } // 给泛型T添加上限约束 class MyArray<T extends Comparable<T>> { List<T> myList; MyArray(){ myList = new ArrayList<T>(); } public void set(T val) { myList.add(val); } public void sort() { ListFunctions.sort(myList, true); System.out.println(myList); } } class ListFunctions { public static <T extends Comparable<T>> void sort(List<T> array, boolean ascending){ if (ascending){ array.sort(null); } else { array.sort(Collections.reverseOrder()); } } }
运行后输出结果为:
[a, b]
说明
这种修改方式完全保留了泛型的编译期类型检查能力,不需要做任何强制类型转换,如果你后续给MyArray传入未实现Comparable的元素类型,编译器会直接报错,符合你保留泛型约束的要求。
内容的提问来源于stack exchange,提问作者Wigggi
相关产品推荐
相关产品推荐

