为什么类型声明在静态类型语言中很重要?
Why is the declaration of type important in a statically typed language?
我试图了解静态类型化编程语言的好处,由此,我想知道为什么我们需要在声明中包含类型?除了使类型明确之外,它还有什么用吗?如果是这样的话,我不明白这一点。我知道静态类型允许在编译时进行类型检查,但是如果我们省略了显式类型声明,难道 Java 仍然不能在编译时推断类型吗?
例如,假设我们在 Java:
myClass test = new myClass();
这里不是不需要类型声明吗?如果我没记错的话,这是静态绑定,Java 应该知道 test
是 myClass
类型,即使在编译时也没有显式声明类型。
对可能重复的回应:这不是关于静态类型与动态类型的问题,而是关于静态类型语言中的类型推断的问题,如已接受的答案中所述。
有必要。您可以继承,其中需要类型。
例如:
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>
,而不仅仅是类型 T
的 List<T>
未指定。该行的非推断版本(也是有效的Java)是:
List<String> emptyStrings = Collections.<String> emptyList();
我试图了解静态类型化编程语言的好处,由此,我想知道为什么我们需要在声明中包含类型?除了使类型明确之外,它还有什么用吗?如果是这样的话,我不明白这一点。我知道静态类型允许在编译时进行类型检查,但是如果我们省略了显式类型声明,难道 Java 仍然不能在编译时推断类型吗?
例如,假设我们在 Java:
myClass test = new myClass();
这里不是不需要类型声明吗?如果我没记错的话,这是静态绑定,Java 应该知道 test
是 myClass
类型,即使在编译时也没有显式声明类型。
对可能重复的回应:这不是关于静态类型与动态类型的问题,而是关于静态类型语言中的类型推断的问题,如已接受的答案中所述。
有必要。您可以继承,其中需要类型。
例如:
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>
,而不仅仅是类型 T
的 List<T>
未指定。该行的非推断版本(也是有效的Java)是:
List<String> emptyStrings = Collections.<String> emptyList();