根据this文章:
与静态类型检查相反,动态类型检查可能会导致程序在运行时由于类型错误而失败。在某些编程语言中,可以通过错误处理或较差的类型安全性来预测这些故障并从中恢复。在其他情况下,类型检查错误被认为是致命的。
Java 就是一个类型检查错误是致命的例子。为什么 Java(也许是大多数静态类型语言)如此严格,以至于如果发生类型错误,它会在运行时失败?假设您将对象 A(实际类型
int
)向上转换为类型 Object
,然后向下转换为 String
。编译时检查将通过,但运行时类型检查将失败并出现致命异常。这看起来很严酷,因为它不像 illegalArgumentException
,程序实际上不能继续(无效的强制转换会失去类型安全性,但不应该是不可能的)。在我看来,最理想的情况是抛出警告,然后在尝试调用整数对象上的 String
方法 indexOf
时致命失败。当尝试执行此无效转换时,Java 实际上无法在运行时继续进行,是否有原因?
Java 就是一个类型检查错误是致命的例子。
不,不是。你可以抓住他们。
为什么 Java(也许是大多数静态类型语言)如此严格,如果发生类型错误,它会在运行时失败?
因为这就是“静态类型”的意思;同上“严格打字”。
假设您将对象 A(实际类型 int)向上转换为 Object 类型,然后向下转换为 String。编译时检查将通过,但运行时类型检查将失败并出现致命异常。
不,不会。它将失败并显示
ClassCastException.
这看起来很严酷,因为它不像非法参数异常,程序实际上无法继续(无效的转换会失去类型安全性,但不应该是不可能的)。
但这是不可能的。演员阵容无法继续进行。生成目标代码的方式假设如此。
在我看来,最好的情况是发出警告
它抛出一个
ClassCastException.
然后,如果尝试调用整数对象上的 String 方法 indexOf,则会致命失败。
嗯,它不会那样做。
当尝试执行此无效转换时,Java 实际上无法在运行时继续进行,是否有原因?
实现是围绕异常发生这一事实来设计的。
它不是那样做的,因为你的建议没有任何好处。
如果您的代码可以在这些情况下继续工作,那么您的代码就是糟糕且多余的,因为强制转换并不是真正必要的,因为您没有对该类型执行任何特定操作。
通常语言的设计并不是为了迎合不必要的代码。
有很多缺点,最明显的是性能:不可能用执行您所描述的语言有效地编译为机器代码。
静态类型语言通常比动态类型语言更快,因为预先了解类型可以实现许多原本不可能实现的优化。
您的任何建议都会使语言动态类型化。
我认为原因是为了保证程序员能够定位问题并修复它,保证软件是正确的。如果您在取消引用之前忽略转换问题,则可能会因为太远而无法轻松追溯。