旧Java代码中的例外情况

时间:2014-10-20 20:41:57

标签: java

当没有泛型时,我正在使用Java中的旧代码。 hashMap在该代码中定义,没有泛型,如:

Map A = new HashMap();

在这段代码中,我想如何识别键和值中的内容,以及用户是否可以放置任何键而不是比较它。由于equals方法没有被覆盖?

3 个答案:

答案 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

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

答案 2 :(得分:0)

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

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

在这种情况下,如果将不同类别的对象用作键,则不应该太成问题,因为HashMap依赖于hashCodeequals方法,而那些不是如果写得正确,则抛出异常。

如果未覆盖equals方法,它可能使用Object equals,它基本上比较了引用。但应该注意的是,像Integer和Date这样的类确实有自己的equals方法。但是,对于任何不属于同一类的东西,它们都不会是真的。

此类集合的真正问题在于,当您从中检索任何内容时,您必须确保获得正确的类型。

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

这就是发明仿制药的原因。