我最近偶然发现了 Collection.checkedMap 的 Javadoc用于创建标准集合类型的动态类型安全 View 的函数族。考虑到它们在诊断相对常见的程序员错误的集合之上添加了另一层安全性,我认为它们会更受欢迎。但是,出于某种原因,在我参与过的所有大型 Java 项目中,我从未见过它们被使用过一次。
我的问题是:Java 程序员不更频繁地使用这些已检查的包装器是否有特殊原因?或者只是缺乏利益/缺乏对它们存在的了解?
编辑:为了澄清我的问题,集合的通用版本仍然包含类型不安全的函数。 Map的 containsKey , containsValue , remove , 和 get所有操作 Object , 例如。我的主要问题是,考虑到这种类型不安全,为什么更多人不使用已检查的实现来诊断运行时类型违规。
最佳答案
只有在滥用(或不使用)泛型时,这些类才是真正必要的。它在运行时重复检查,这些检查应该足以通过泛型引擎的类型安全保证在编译时执行。
因此,只有在 API 设计者不信任库的用户并希望保护自己或用户免受用户不当使用 map 的影响时,使用这些方法才真正有趣。
简而言之:如果您的代码编译时没有原始类型警告或任何未经检查的转换/类型警告,您保证 checked* 方法不会给你任何好处;它们只是运行时命中。
编辑
您似乎得出结论,因为 remove、get 等对 Object 进行操作,所以它们在某种程度上是类型不安全的。他们不是。这些方法都不会将其操作数存储在 map 中,因此您当然不会损害 map 本身的类型安全性。这些方法采用 Object 的一个主要原因是:为了向后兼容。从来没有任何严格的要求查找需要坚持同一个类。例如,如果类 A 的实例和类 B 的实例可能以某种方式彼此相等,则将 a 放入映射中,然后调用 remove(b) < em="">应该删除a的映射。
一旦添加泛型以保持向后兼容性,就需要支持此行为。因此,他们无法将接口(interface)更新为类似 remove(K) 的东西,因为现有代码可能依赖于能够在给定完全不同类的实例的情况下删除映射。然而,它不是类型不安全的,并且使用 map 的检查版本不会丝毫改变这种行为。
关于java - 为什么不更常用 Collections.checkedMap 和 friend ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4662628/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我正在学习如何在我的Ruby代码中使用Module.prepend而不是alias_method_chain,我注意到有些人使用send调用它(example):ActionView::TemplateRenderer.send(:prepend,ActionViewTemplateRendererWithCurrentTemplate)而其他人直接调用它(example):ActionView::TemplateRenderer.prepend(ActionViewTemplateRendererWithCurrentTemplate)而且,虽然我还没有看到任何人使用这种风格,但我从
我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www