Java中ArrayList倒序排序报错:无法解析getRating()方法
问题原因分析
这个问题出在Java的泛型类型推断上。当你直接使用Comparator.comparing(m->m.getRating())作为sort方法的参数时,编译器可以通过sort方法需要的Comparator<Movie>类型,反向推断出lambda表达式中的m是Movie类型,所以能正确识别getRating()方法。
但当你链式调用.reversed()时,编译器的类型推断链条被打断了:它先处理comparing(m->m.getRating())这部分,此时没有明确的目标类型提示,编译器无法确定m的具体类型(会默认推断为Object),自然就找不到getRating()方法了。
解决方法
这里有三种简单的修复方式:
方法1:使用方法引用替代lambda表达式
方法引用的类型推断比lambda更明确,编译器能直接识别出目标类型:
List<Movie> result = movieRepository.findAll(); result.sort(Comparator.comparing(Movie::getRating).reversed());
方法2:明确指定泛型参数
手动给comparing方法指定泛型类型,告诉编译器T是Movie,U是getRating()返回的类型(比如Integer):
List<Movie> result = movieRepository.findAll(); result.sort(Comparator.<Movie, Integer>comparing(m->m.getRating()).reversed());
方法3:先将Comparator存入变量
把Comparator先赋值给一个明确类型的变量,再调用reversed(),这样编译器能清晰识别类型:
List<Movie> result = movieRepository.findAll(); Comparator<Movie> ratingComparator = Comparator.comparing(m->m.getRating()); result.sort(ratingComparator.reversed());
这些方法本质上都是帮编译器明确泛型类型,让它能正确找到getRating()方法。
内容的提问来源于stack exchange,提问作者tomas
相关产品推荐
相关产品推荐

