使用Stream与Lambda时无法调用导入类的isFrom()方法
问题原因与解决办法
你遇到的问题根源在于原始类型(Raw Type)的使用,导致编译器无法识别集合中元素的具体类型,进而找不到isFrom()方法。
具体问题分析
在InternalIterator的main方法里,你是这样声明集合的:
List persons = Person.makeList();
这里的List是没有指定泛型参数的原始类型,Java编译器会把这个集合里的所有元素都当作Object类型处理。当你在stream的filter里调用p.isFrom("Milano")时,编译器认为p是Object实例,而Object类并没有定义isFrom()方法,所以就会抛出"Cannot resolve method 'isFrom(java.lang.String)'"的错误。
解决步骤
只需要给List加上泛型参数<Person>,明确集合中元素的类型即可:
import java.util.List; import ardea.project.Person; public class InternalIterator { public static void main(String[] args) { // 加上泛型<Person>,明确元素类型 List<Person> persons = Person.makeList(); long count = persons.stream() .filter(p -> p.isFrom("Milano")) .count(); System.out.println("Persone di Milano: " + count); } }
额外说明
Java 5引入泛型后,就不推荐使用原始类型了——原始类型会绕过编译时的类型检查,不仅会导致这类方法找不到的错误,还可能引发运行时的ClassCastException,尽量始终使用带泛型参数的集合类型,让编译器帮你提前发现类型问题。
内容的提问来源于stack exchange,提问作者Giacomo Brunetta
相关产品推荐
相关产品推荐

