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

时间:2015-12-25 06:49:50

标签: java oop variable-declaration static-typing

我试图理解静态类型的编程语言的好处,并且通过它,我想知道为什么我们需要在声明中包含类型?它是出于任何目的而不是使类型明确吗?如果是这种情况,我不明白这一点。我知道静态类型允许在编译时进行类型检查,但如果我们省略显式类型声明,那么Java在编译时是否仍然可以推断类型?

例如,让我们说我们有Java:

myClass test = new myClass();

这里没有必要的类型声明吗?如果我没有弄错,这是静态绑定,Java应该知道test的类型为myClass,即使在编译时也没有明确的类型声明。

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

2 个答案:

答案 0 :(得分:11)

静态类型语言,允许您省略类型声明。这称为type inference。缺点是设计更加困难(对于语言设计者而言),实施起来比较困难(对于编译器编写者而言),并且在出现问题时(对于程序员来说)更难以理解。最后一个问题是,如果推断出很多(或所有)类型,编译器就不能真正告诉你超过"这些类型并不是一致的&#34 ; - 经常通过一个神秘的信息。

在一个像你引用的那个简单的案例中,是的,这很容易。但随着你越来越远离琐碎的情况,系统的复杂性会迅速增加。

Java确实以非常有限的形式进行了一些类型推断。例如,在此代码段中:

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

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

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

答案 1 :(得分:1)

这是必要的。您可以拥有继承,其中类型是必需的。

例如:

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

多态性是一样的。

然后,您可以将所有Building收集到数组中。如果有一个House和一个SkyScraper,则无法执行此操作。