降级至Java 1.7后com.google.common.collect使用报错求助
问题分析与解决方案
这个问题我太熟了!本质是Java 7和Java 8在泛型类型推断能力上的差异,结合Guava的Lists.newArrayList()方法的特性导致的。
为什么Java 8能跑,Java 7不行?
Java 8引入了目标类型推断——编译器会根据变量的预期类型(也就是myFeats的List<WekaFeature<Document>>),反向推断泛型方法的类型参数。但Java 7不支持这个特性,它只能从你传入的参数(这里是WekaFeature[]数组)来推断,得出的类型是List<WekaFeature>,而List<WekaFeature>和List<WekaFeature<Document>>是泛型不兼容的,所以编译报错。
三种快速解决方法
- 显式指定泛型类型参数:直接告诉
newArrayList()要创建的列表类型,Java 7就能正确识别:myFeats = Lists.<WekaFeature<Document>>newArrayList(new WekaFeature[]{new AFeature(), new BFeature(), new CFeature()}); - 去掉数组包装,直接传元素:Guava的
newArrayList()支持可变参数,直接传入元素的话,Java 7可以从每个元素的类型(都是WekaFeature<Document>的子类)推断出正确的泛型类型:myFeats = Lists.newArrayList(new AFeature(), new BFeature(), new CFeature()); - (可选)升级Guava到兼容Java 7的稳定版本:如果你用的是非常老旧的Guava版本,可能存在泛型定义的兼容性问题,建议升级到Guava 18+(完全兼容Java 7,同时也支持Java 8),不过前两个方法已经能解决问题,这个是锦上添花的操作。
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

