-2

如果List<Object>包含List<Integer>比它更完美但是java如何允许List<Integer>包含测试List<Object>而不抛出任何编译时错误。

测试用例 1

Object obj = "one";
List<Object> objs = Arrays.<Object>asList("one", 2, 3.14, 4);
List<Integer> ints = Arrays.asList(2, 4);
assert objs.contains(obj); //Statement 1
assert objs.containsAll(ints); //Statement 2
assert !ints.contains(obj); //Statement 3 
assert !ints.containsAll(objs); //Statement 4

在上述案例语句 3 和 4 中编译并运行成功。所以我的疑问是:

  1. 由于应该存在编译时错误,如何运行语句 3 和 4?
  2. 提供这种相互矛盾的支持是一个错误还是有某种原因?
4

3 回答 3

1

由于应该存在编译时错误,如何运行语句 3 和 4?

这是因为contains(object)将采取任何对象。

提供这种相互矛盾的支持是一个错误还是有某种原因?

在 Java 拥有泛型之前,您可以调用 contains(Object),因此今天您可以使用在泛型之前编写的代码。

于 2013-09-03T12:15:55.543 回答
0

为了向后兼容 Java 1.4 编译代码,不得不做出这个不幸的决定。

没有这个,如果没有完全重新编译,1.4 代码根本无法在 1.5 环境中运行。

于 2013-09-03T12:17:17.090 回答
0

从 JDK 源代码来看,java.util.List 具有以下方法:

boolean contains(Object o); containsAll(Collection<?> c)

因此不存在任何编译时问题(您在代码中使用的任何输入都是正确的)。

由于这些方法不使用泛型,因此在 JDK 内部一定有一个原因,可能是为了在某些实现/使用 List 中向后兼容。

如您所知,泛型只是 Java 中的编译时检查,因此运行时与使用List<Object>.

于 2013-09-03T12:23:38.413 回答