请考虑以下来自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
的引用应参数化
javac:
注意:GenericsTest.java使用未经检查或不安全的操作。
因为我无法更改API方法的签名来摆脱此警告,所以我可以使用以下注释@SuppressWarnings("unchecked")
或将其强制转换为Collection<?>
:
((Collection<?>) principals.fromRealm(realmName)).stream().collect(Collectors.toSet());
由于这种转换当然总是有效,所以我想知道为什么编译器不只是将这种情况Collection
视为Collection<?>
警告而是警告这种情况。添加注释或强制转换不会单单改善代码,但会降低可读性,甚至可能掩盖有关使用非参数类型的实际有效警告。
原因很简单:
您可能以Object
与from Collection<?>
相同的方式阅读Collection
。 但是 您不能将Object
s
添加到Collection<?>
(编译器禁止这样做),而Collection
可以添加。
如果在Java 5发行之后,编译器已将每次转换Collection
为Collection<?>
,则先前编写的代码将不再编译,因此将破坏向后兼容性。
考虑下面的API方法,它取自Shiro的接口,但也可能存在于其他库中: 是的,即使是现在,仍然有库使用原始类型,可能是为了保持Java 1.5之前的兼容性?! 如果我现在想将此方法与流或选项一起使用,如下所示: 我收到一条关于未经检查的转换和使用原始类型的警告,我更喜欢使用参数化类型。 日食: 类型安全:收集(Collector)方法属于原始类型Stream javac: 注意:GenericsT
问题内容: 事实并非如此,这让我感到惊讶。 我认为,如果这样声明,那将是很有意义的: 毕竟,是的集合,不是吗? 那么,为什么没有这样一个很好的实现呢? 感谢Cletus提供的最权威的答案,但是我仍然想知道为什么,如果你已经可以查看(通过),那么它不仅扩展了该接口。 如果a 是a ,则元素是什么?唯一合理的答案是“键值对” 确实会很棒! 但这提供了非常有限的(且不是特别有用的)Map抽象。 但是,如
问题内容: 在OmniFaces中,FullAjaxExceptionHandler找到正确的错误页面以使用后,将调用JSF运行时来构建视图并呈现它,而不是包含AJAX调用的页面。 为什么这个?恕我直言,只是执行一个会更简单?是否有这样做的具体原因? 我们正在基于FullAjaxExceptionHandler编写我们自己的ExceptionHandler,并想了解这种设计背后的原因。 问题答案:
问题内容: 为什么接口不扩展接口?不是键值对的集合吗? 问题答案: 集合假定一个值的元素。映射假定键/值对的条目。他们本来可以重新使用相同的通用接口,但是它们实现的某些方法不兼容,例如 您可以将Map建模为条目的集合,这就是这样做的。 有一些共同的方法。,,,但这些都不太可能有多少价值作为一个独立的接口。(可以再次使用)
我觉得奇怪/违反直觉的是,我们不必像这样指定选择器属性(尽管如果我们这样写,它仍然有效): 相反,我们只需要指定input属性,就可以神奇地得到指令: 我不喜欢这个“快捷方式”/语法糖/魔法,因为它看起来像是绑定到元素的属性,而不是实际发生的事情:我们绑定到属性指令的属性。因此,仅仅通过查看HTML,我们不能很容易地确定属性绑定到哪个元素/组件/指令。 是HTML元素属性还是带有输入属性的属性指令
在让IAM策略为我的SQS队列工作时遇到问题,我尝试了IAM策略模拟器。无论我的政策多么简单,它总是说它被拒绝了。 以下政策旨在允许对任何SQS资源采取任何行动。这是我附加到特定用户的一个策略,这就是没有指定主体的原因。 当我尝试在策略模拟器中运行这个列表队列操作时,我会被拒绝:隐式拒绝(没有匹配的声明)。这种说法怎么可能不符合呢? 以下是策略编辑器上被拒绝的截图: