我刚刚开始学习Guava,我注意到ImmutableList.builder()
有一些奇怪的地方。
这不编译:
List<String> iList = ImmutableList.builder().add("One").add("Two").build();
//Type mismatch: cannot convert from List<Object> to List<String>
这是可行的:
List<String> iList = new ImmutableList.Builder<String>().add("One").add("Two").build();
我可以接受使用new ImmutableList.Builder<String>()
,但这是ImmutableList.builder()
的bug吗?
1条答案
按热度按时间8hhllhi21#
否,只提供类型参数
这绝不是Guava中的bug,它只是Java语言的一个特性/限制。编译器无法从前面的方法调用或结果被赋给的变量的声明中推断
build()
的返回类型。安吉丽卡·兰格解释道
自动类型参数推断。该方法像常规非泛型方法一样调用,即不指定类型参数。在这种情况下,编译器自动从调用上下文推断类型参数。
她还在为什么示例创建表达式的类型推断失败中给出了一个类似的例子?
和国家
在上面的例子中,由于new-expression
new ArrayList<>()
没有构造函数参数,它既没有出现在赋值语句的右侧,也没有作为方法调用的参数出现,而是出现在方法调用链中,因此会发出错误消息。这样的链不是有效的类型推理上下文。