2014-10-20 24 views
0

我没有泛型时使用Java中的旧代码。 HashMap的是在代码中定义不一样的仿制药:在旧的Java代码中的例外

Map A = new HashMap(); 

在这段代码怎么想找出放于键和值是什么,如果用户可以把不是如何将它比它的任何键。由于equals方法不会被覆盖?

+0

参考值。 *不寒而栗*。 – 2014-10-20 20:43:53

+2

没有问题。但是,如果您需要维护一个大型遗留系统,请先从添加泛型开始。使用不推荐标记更新API。使用FindBugs。因为任何异常都必须由于某种错误。 – 2014-10-20 20:55:19

回答

1

不幸的是,由于没有为地图定义泛型,因此不能限制可放置的内容。为了便于比较,将调用equals方法,如果它没有被覆盖,那么Object.equals将被称为

+0

在这种情况下,代码完全取决于我们插入的键的类型,并且如果插入了不同类型的键(由于用户输入),它可能会产生异常。 – piyush 2014-10-20 20:50:30

1

即使使用泛型,用户也可以将所有键/值对放入他们想要的映射中。下面的代码编译就好了,并在运行时将很好地工作:

Map<String,String> map = new HashMap<>(); 
(Map)map).put("key", new Double(2)); 

它只会是一个问题,当我有这样

(String)map.get("key"); 

代码,因为这会在运行时导致ClassCastException

  • 如果要创建一个API,你暴露一个可变的Map泛型,你可以假设一个用户只能将在正确的类型
  • 的值如果要创建一个API,你暴露一个可变没有泛型的Map,您需要清楚地记录它。在这种情况下,您可以考虑不公开地图,而是在API上提供put方法,而不是硬编码您接受的对象的类型
  • 如果您只是编写自己的内部代码并且坚持使用JDK1.4或更低,您完全可以控制该地图中的内容。小心一点。如果您针对旧版API工作,则同样适用。它将/应该被记录在地图上,你需要尊重这一点。
0

在泛型之前的日子里,所有容器都使用Object对象。

程序员有责任确保他放入容器的所有内容都是兼容的类型。

在这种情况下,它不应该是,如果有不同的类用作键的对象的问题太多,因为HashMap依靠hashCodeequals方法,以及它们是否正确写入那些不抛出异常。

如果equals方法没有被覆盖,它可能使用Object的equals,它基本上比较了引用。但是应该指出的是像Integer和Date这样的类有自己的方法equals。但是,对于不属于同一班级的任何事情,他们不会是真的。

这样的集合的真正问题是,当你从它们中检索任何东西时,你必须确保你得到了正确的类型。

所以在过去,曾经有很多if (o instanceof MyClass) then...涉及集合,程序员不能控制对象的类型。

这就是为什么仿制药被发明的原因。