gpt4 book ai didi

java - 为什么 Collection 不被简单地视为 Collection

转载 作者:IT老高 更新时间:2023-10-28 20:44:47 31 4
gpt4 key购买 nike

考虑以下取自 Shiro 的 org.apache.shiro.subject.PrincipalCollection 的 API 方法接口(interface),但可能也存在于其他库中:

Collection fromRealm(String realmName);

是的,即使现在仍有库使用原始类型,可能是为了保持 Java 1.5 之前的兼容性?!

如果我现在想将此方法与这样的流或选项一起使用:

principals.fromRealm(realmName).stream().collect(Collectors.toSet());

我收到关于未经检查的转换和使用原始类型的警告,我应该更喜欢使用参数化类型。

eclipse :

Type safety: The method collect(Collector) belongs to the raw type Stream. References to generic type Stream<T> should be parameterized

javac:

Note: GenericsTest.java uses unchecked or unsafe operations.

由于我无法更改 API 方法的签名以消除此警告,因此我可以使用 @SuppressWarnings("unchecked") 进行注释。或直接转换为 Collection<?>像这样:

((Collection<?>) principals.fromRealm(realmName)).stream().collect(Collectors.toSet());

因为这个 Actor 当然总是有效,我想知道为什么编译器不简单地处理 Collection作为 Collection<?>但警告这种情况。添加注解或强制转换并不会改善代码一点点,但会降低可读性,甚至可能掩盖有关使用未参数化类型的实际有效警告。

最佳答案

原因很简单:

您可以阅读 Object来自 Collection<?>Collection 相同的方式. 但是你不能加Object转至 Collection<?> (编译器禁止这样做)而对于 Collection你可以。

如果在 Java 5 发布之后编译器已经翻译了每个 CollectionCollection<?> ,那么以前编写的代码将不再编译,从而会破坏向后兼容性。

关于java - 为什么 Collection 不被简单地视为 Collection<?>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55514277/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com