为什么类型声明在静态类型语言中很重要?

Why is the declaration of type important in a statically typed language?

我试图了解静态类型化编程语言的好处,由此,我想知道为什么我们需要在声明中包含类型?除了使类型明确之外,它还有什么用吗?如果是这样的话,我不明白这一点。我知道静态类型允许在编译时进行类型检查,但是如果我们省略了显式类型声明,难道 Java 仍然不能在编译时推断类型吗?

例如,假设我们在 Java:

myClass test = new myClass();

这里不是不需要类型声明吗?如果我没记错的话,这是静态绑定,Java 应该知道 testmyClass 类型,即使在编译时也没有显式声明类型。

对可能重复的回应:这不是关于静态类型与动态类型的问题,而是关于静态类型语言中的类型推断的问题,如已接受的答案中所述。

有必要。您可以继承,其中需要类型。

例如:

Building build1 = new House();
Building build2 = new SkyScraper();

多态也是一样

然后您可以将所有 Building 收集到数组中。如果会有一个 House 和一个 SkyScraper 你不能这样做。

种允许您省略类型声明的静态类型语言。这叫做type inference。缺点是它更难设计(对于语言设计者),更难实现(对于编译器编写者),并且在出现问题时更难理解(对于程序员)。最后一个问题是,如果推断出许多(或所有)类型,编译器实际上不能告诉你比 "the types aren't all consistent" 多得多的信息——通常是通过一条神秘的消息。

在像您引用的这种微不足道的情况下,是的,这很容易。但是随着您离微不足道的情况越来越远,系统的复杂性会迅速增加。

Java 实际上以非常有限的形式进行了一些类型推断。例如,在这个片段中:

List<String> emptyStrings = Collections.emptyList();

... 编译器推断方法调用 emptyList returns 是 List<String>,而不仅仅是类型 TList<T>未指定。该行的非推断版本(也是有效的Java)是:

List<String> emptyStrings = Collections.<String> emptyList();