我试图理解静态类型的编程语言的好处,并且通过它,我想知道为什么我们需要在声明中包含类型?它是出于任何目的而不是使类型明确吗?如果是这种情况,我不明白这一点。我知道静态类型允许在编译时进行类型检查,但如果我们省略显式类型声明,那么Java在编译时是否仍然可以推断类型?
例如,让我们说我们有Java:
myClass test = new myClass();
这里没有必要的类型声明吗?如果我没有弄错,这是静态绑定,Java应该知道test
的类型为myClass
,即使在编译时也没有明确的类型声明。
对可能重复的回应:这不是关于静态与动态类型的问题,而是关于静态类型语言中的类型推断,如接受的答案中所述。
答案 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
,则无法执行此操作。