区别不在于在变量上声明类型。它比这更微妙(和Eric Lippert 的步伐,我认为这个术语的定义相当明确)。区别在于,在强类型语言中,每个表达式都有一个可以在编译时确定的类型,并且只允许适用于该类型的操作。
在无类型(对批评者来说是“弱类型”,对粉丝来说是“动态类型”)语言中,情况并非如此。该语言允许对任何类型执行任何操作,但相当重要的条件是操作可能会失败。也就是说,虽然语言可能允许操作,但运行时可能不允许。
请注意,可以使用强类型语言而不需要到处进行类型声明。事实上,没有强类型语言可以。考虑一下Java:
String s = "hellO";
int l = s.getBytes().length;
编译器如何确定那里.length
是合法的?这是合法的,因为它被用于byte[]
. 但是没有任何东西是byte[]
这里的声明。相反,编译器知道这s
是 a String
,并且当您调用getBytes()
a时String
,您会得到 a byte[]
。它从这些事实中推断出 of 的类型s.getBytes()
是 a byte[]
,因此请求它是合法的length
。
一些类型系统比 Java 更复杂的语言允许编译器推断更多。例如,在 Scala 中,您可以说:
val s = "hello"
val l = s.getBytes().length
并且编译器将推断 and 的类型,s
以及l
中间表达式的类型。
具有强类型化但需要冗余类型声明的类型推断人为限制的语言(如 Java)被描述为具有清单类型,因为必须使类型清单化,这是一种花哨的说法,即显式地存在,这是花哨的说法写下来。