我没有泛型时使用Java中的旧代码。 HashMap的是在代码中定义不一样的仿制药:在旧的Java代码中的例外
Map A = new HashMap();
在这段代码怎么想找出放于键和值是什么,如果用户可以把不是如何将它比它的任何键。由于equals方法不会被覆盖?
我没有泛型时使用Java中的旧代码。 HashMap的是在代码中定义不一样的仿制药:在旧的Java代码中的例外
Map A = new HashMap();
在这段代码怎么想找出放于键和值是什么,如果用户可以把不是如何将它比它的任何键。由于equals方法不会被覆盖?
不幸的是,由于没有为地图定义泛型,因此不能限制可放置的内容。为了便于比较,将调用equals方法,如果它没有被覆盖,那么Object.equals将被称为
在这种情况下,代码完全取决于我们插入的键的类型,并且如果插入了不同类型的键(由于用户输入),它可能会产生异常。 – piyush 2014-10-20 20:50:30
即使使用泛型,用户也可以将所有键/值对放入他们想要的映射中。下面的代码编译就好了,并在运行时将很好地工作:
Map<String,String> map = new HashMap<>();
(Map)map).put("key", new Double(2));
它只会是一个问题,当我有这样
(String)map.get("key");
代码,因为这会在运行时导致ClassCastException
。
Map
泛型,你可以假设一个用户只能将在正确的类型Map
,您需要清楚地记录它。在这种情况下,您可以考虑不公开地图,而是在API上提供put
方法,而不是硬编码您接受的对象的类型在泛型之前的日子里,所有容器都使用Object对象。
程序员有责任确保他放入容器的所有内容都是兼容的类型。
在这种情况下,它不应该是,如果有不同的类用作键的对象的问题太多,因为HashMap
依靠hashCode
和equals
方法,以及它们是否正确写入那些不抛出异常。
如果equals
方法没有被覆盖,它可能使用Object的equals
,它基本上比较了引用。但是应该指出的是像Integer和Date这样的类有自己的方法equals
。但是,对于不属于同一班级的任何事情,他们不会是真的。
这样的集合的真正问题是,当你从它们中检索任何东西时,你必须确保你得到了正确的类型。
所以在过去,曾经有很多if (o instanceof MyClass) then...
涉及集合,程序员不能控制对象的类型。
这就是为什么仿制药被发明的原因。
参考值。 *不寒而栗*。 – 2014-10-20 20:43:53
没有问题。但是,如果您需要维护一个大型遗留系统,请先从添加泛型开始。使用不推荐标记更新API。使用FindBugs。因为任何异常都必须由于某种错误。 – 2014-10-20 20:55:19