当前位置: 首页 > 知识库问答 >
问题:

为什么集合不被简单地视为集合

颜安宁
2023-03-14

考虑下面的API方法,它取自Shiro的org.apache.shiro.subject.PrinialCollection接口,但也可能存在于其他库中:

Collection fromRealm(String realmName);

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

如果我现在想将此方法与流或选项一起使用,如下所示:

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

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

日食:

类型安全:收集(Collector)方法属于原始类型Stream

javac:

注意:GenericsTest.java使用未检查或不安全的操作。

由于我无法更改API方法的签名来消除此警告,因此我可以使用@SuppressWarnings(“unchecked”)进行注释,或者直接转换为集合

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

当然,这个演员阵容总是有效的,我想知道为什么编译器不简单地将Collection视为Collection


共有3个答案

宋耀
2023-03-14

一个<代码>集合

请不要给我添加任何内容。我有一个严格的内容类型。。。我忘了是什么类型的。

系列则表示:

一切都很酷!你可以添加任何你喜欢的东西,我没有限制。

那么,为什么编译器不应该将集合转换为集合呢

石苏燕
2023-03-14

原始类型和无界通配符

List raw = new ArrayList();
raw.add("");
raw.add(1);

实际上,在无界通配符集合的情况下(List

因为我们不知道c的元素类型代表什么,所以我们不能向它添加对象。add()方法接受集合的元素类型E类型的参数。当实际类型参数为?,它代表某种未知类型。我们传递要添加的任何参数都必须是此未知类型的子类型。因为我们不知道那是什么类型的,所以我们不能传递任何信息。唯一的例外是null,它是每种类型的成员。

屈升
2023-03-14

原因很简单:

您可以从集合中读取对象s

如果在Java 5发布后,编译器将每个集合翻译成集合

 类似资料:
  • 问题内容: 请考虑以下来自Shiro 界面的API方法,但也可能存在于其他库中: 是的,即使是现在,仍然有一些库使用原始类型,可能是为了保留Java 1.5之前的兼容性? 如果我现在想将此方法与流或类似的可选项一起使用: 我收到有关未经检查的转换和使用原始类型的警告,我更喜欢使用参数化类型。 蚀: 类型安全:方法collect(Collector)属于原始类型Stream。泛型类型Stream 的

  • 问题内容: 我正在将某些东西从Java移植到C#。在Java中,a 取决于其中的项目。在C#中,我总是从… 获取相同的哈希码。 为什么是这样? 对于我的某些对象,哈希码必须有所不同,因为其list属性中的对象使对象不相等。我希望哈希码对于对象的状态始终是唯一的,并且仅在对象相等时才等于另一个哈希码。我错了吗? 问题答案: 为了正常工作,散列码必须是不可变-一个对象的散列码必须 永远不会 改变。 如

  • 问题内容: 在使用Guava集合并阅读其文档时,我已经阅读了几次“术语 视图” 。 我一直在寻找一种解释,说明在这种情况下视图是什么以及它是否在Guava之外使用。在这里经常使用。番石榴的这种类型在其名称中具有 视图 。 我的猜测是,一个集合的视图是另一个具有相同数据但结构不同的集合。例如,当我将条目从a添加到后者时,将是前者的视图。那是对的吗? 有人可以给我链接到一个公认的 view 定义(如果

  • 问题内容: 给出以下作为数据类的示例: 假设我会有一个国家清单 我想将这些信息流式传输到它们的区域及其对应的名称,我想执行以下操作: 但是,该代码无法编译,因为“ getRegions”的返回值是一个Collection(列表),而不是flatMap方法接受的Stream。但是由于我知道任何Collection都可以通过其Collection.stream()方法进行流传输,所以这应该不是问题。我

  • 问题内容: 我有一个简单的类,并且可以强制转换为集合接口(或),而不会出现任何编译器错误。请注意,该类不实现任何接口或扩展任何其他类。 当我尝试将类转换为集合时,为什么Java编译器不返回 不兼容类型错误? 没有实现。我预计会出现不兼容的类型错误,因为给定当前的类签名,所以不能是。 问题答案: 不是因为它们是集合类,而是因为它们是 接口 。没有实现它们,但是可以实现它的子类。因此,这不是编译时错误

  • 我正在为一个类编写一个单元测试,如下所示: 现在,当我运行这段代码时,它给我一个错误,即我无法将强制转换为Java中的集合。 ps:有一个单独的类,名为,它的setter如下所示: 而我正在尝试使用上面的这种方法。