当没有泛型时,我正在使用Java中的旧代码。 hashMap在该代码中定义,没有泛型,如:
Map A = new HashMap();
在这段代码中,我想如何识别键和值中的内容,以及用户是否可以放置任何键而不是比较它。由于equals方法没有被覆盖?
答案 0 :(得分:1)
不幸的是,由于没有为地图定义泛型,因此您无法限制可以放置的内容。为了比较,将调用equals方法,如果没有覆盖你输入的键,那么将调用Object.equals
答案 1 :(得分:1)
即使使用泛型,用户也可以将任何键/值对放在他们想要的地图中。以下代码编译得很好,并且在运行时将完美运行:
Map<String,String> map = new HashMap<>( );
(Map)map).put( "key", new Double(2) );
当我有像
这样的代码时,这只会是一个问题(String)map.get( "key" );
因为这会在运行时导致ClassCastException
。
Map
,则可以假设用户只会输入正确类型的值Map
,则需要清楚地记录它。在这种情况下,您可以考虑不公开地图,而是在API上提供put
方法,而不是硬编码您接受的对象类型答案 2 :(得分:0)
在泛型之前的日子里,所有容器都使用Object对象。
程序员有责任确保他放入容器的所有东西都是兼容的类型。
在这种情况下,如果将不同类别的对象用作键,则不应该太成问题,因为HashMap
依赖于hashCode
和equals
方法,而那些不是如果写得正确,则抛出异常。
如果未覆盖equals
方法,它可能使用Object equals
,它基本上比较了引用。但应该注意的是,像Integer和Date这样的类确实有自己的equals
方法。但是,对于任何不属于同一类的东西,它们都不会是真的。
此类集合的真正问题在于,当您从中检索任何内容时,您必须确保获得正确的类型。
所以在过去,曾经有很多if (o instanceof MyClass) then...
涉及集合,程序员无法控制对象的类型。
这就是发明仿制药的原因。