【发布时间】:2012-07-01 17:38:43
【问题描述】:
为什么我尝试将Integer 添加到声明为Object[] 但实例化为String[] 的Java 数组不会产生编译错误?
Object[] ob = new String[1];
ob[0] = new Integer(1); // this shouldn’t compile but it does!
当我运行它时,我得到一个运行时异常,而不是一个(非常喜欢的)编译时错误!这是正确的行为吗?我不应该得到一个编译时错误吗?
【问题讨论】:
-
ob是一个Object[]。Integer是Object的子类。所以这应该编译得很好。也许您想将ob声明为String[]? -
#HovercraftFullOfEels 你说的写得不好的代码是真的,但在其他语言中,C++ 会想到你受到编译器的保护,不会写出这样的废话。顺便提一下,这是一个简单的例子。在现实世界的程序中,您不可能同时看到所有代码。你怎么知道你是否为正确的容器分配了正确的类型?
-
@smallB:除了将变量声明为可能的最通用类型之外,我不知道答案。
-
我不明白为什么这个问题被关闭了。这是一个关于 Java 语义陷阱的完全合理的问题。可能让您感到困惑的要点是引用数组的运行时类型 (
String[]) 与数组变量的编译时类型 (Object[])。编译器只强制你放入数组的内容与引用它的数组变量的静态类型兼容。 -
我同意@Marko,这是一个关于 Java 的有效问题,澄清这些原则只能帮助我们所有人,我已投票重新开放并投票赞成该问题。我看到关闭它的唯一原因是某处是否存在完全相同的副本。
标签: java