最近我发现了在调用
Java方法时明确声明泛型类型的奇怪语法.例如:
Collections.emptyList();
返回一个空的List< String>.然而,这似乎是愚蠢的,因为< T> emptyList()只是未经检查的类型转换(List< T>)EMPTY_LIST,使得所有结果具有相同的类型擦除(并且是相同的对象).此外,通常不需要这种显式类型声明,因为编译器经常推断类型:
List empty = Collections.emptyList();
在做了一些挖掘之后,我发现了另外两次你想要使用这种语法的时候,他们都是由于使用了Guava库,显然是试图在一行中放置太多的语句.
>装饰集合,例如使用同步包装器,编译器无法推断类型.如果取出类型声明,以下内容将无效:无法从Set< Object>设置< String> ;:::
Set set = Collections.synchronizedSet(Sets.newHashSet());
>当编译器尝试使具有特定类型参数时,获取更少的具体类型参数.例如,没有类型声明,以下语句也是抱怨的:不能从Map< String,String>映射< String,Object> ;::
Map toJson = ImmutableMap.of("foo", "bar");
我发现讽刺的是,在第一种情况下,推断的类型参数太笼统,在第二种情况下它们太具体,但我认为这只是Java中泛型系统的一个工件.
然而,这种语言结构本身似乎是可以避免的,除了这些strange use cases invented by the Guava team.另外,似乎对我来说,编译器有一种方法来推断上述例子中的类型参数,开发人员只是选择不这样做.在Java编程中使用此构造是否有必要或有用的示例,还是仅存在以使编译器更简单/ JDK开发人员的生活更轻松?