为什么“收藏”不被简单地视为“收藏<>
考虑以下从 Shiro 的 org.apache.shiro.subject.PrincipalCollection
接口中获取的 API 方法,但可能也存在于其他库中:
Collection fromRealm(String realmName);
是的,即使在今天,仍然有库使用原始类型,可能是为了保持Java 1.5之前的兼容性?!
如果我现在想将此方法与流或可选选项一起使用,如下所示:
principals.fromRealm(realmName).stream().collect(Collectors.toSet());
我收到有关未经检查的转换和使用原始类型的警告,并且我应该更喜欢使用参数化类型。
日蚀:
类型安全:方法 collect(Collector) 属于原始类型 Stream。对泛型类型 Stream<T> 的引用应参数化
javac:
注意:GenericsTest.java使用未经检查或不安全的操作。
由于我无法更改API方法的签名以摆脱此警告,因此我可以注释或简单地转换为如下所示:@SuppressWarnings("unchecked")
Collection<?>
((Collection<?>) principals.fromRealm(realmName)).stream().collect(Collectors.toSet());
由于这种强制转换当然总是有效的,我想知道为什么编译器不简单地将其视为,而是警告这种情况。添加批注或强制转换不会改善代码,但会降低可读性,甚至可能隐藏有关使用非参数化类型的实际有效警告。Collection
Collection<?>