在像Java这样的静态类型语言中,据我所知,类型声明基本上是为了在编译时捕获错误,这是与动态类型语言相比的明显优势。但是当Java进行后期绑定时,我们会遇到诸如“ClassCastException”之类的错误,显示了声明的类型在运行时某种程度上是相关的。但是为什么声明类型实际上很重要呢?
例如:
我知道这只是一个不必要的强制类型转换的超级糟糕的例子,但我只是举了一个例子。我们始终试图避免运行时异常,那么为什么Java不能忽略强制类型转换并在实际对象类型上调用
例如:
public class TestClass
{
public static void main(String[] args)
{
Animal d = new Animal();
((Dog)d).bark(); //ClassCastException because an Animal is not a dog, which would make sense to throw at compile-time, but not at runtime.
}
}
class Dog extends Animal{}
class Animal
{
void bark()
{
System.out.println("Woof");
}
}
我知道这只是一个不必要的强制类型转换的超级糟糕的例子,但我只是举了一个例子。我们始终试图避免运行时异常,那么为什么Java不能忽略强制类型转换并在实际对象类型上调用
bark
方法,这种情况下是Animal
?我一直在阅读关于鸭子类型的文章,似乎可以在Java(即如果这个对象吠叫,那么让我们把它当作一只狗!)或任何静态类型语言中使用类似的适应,因为在运行时,Java似乎表现得很动态。
编辑:现在我想更多地思考它,这个问题涉及到运行时类型检查的需要。为什么需要发生这种情况?静态类型的语言在强制类型转换时会出现运行时异常,这似乎是不好的。
bark()
在Animal
中定义。 - Ramanlfc