类型安全意味着编译器在编译的时候会验证类型,如果你尝试将一个错误的类型分配给一个变量时,会抛出一个错误。
下面是一个例子:
// Fails, Trying to put an integer in a string
String one = 1;
// Also fails.
int foo = "bar";
这也适用于参数,因为你明确定义了参数类型,比如:
int AddTwoNumbers(int a, int b)
{
return a + b;
}
如果我尝试这样调用:
int Sum = AddTwoNumbers(5, "5");
编译器会抛出一个异常,因为我传递了一个字符串“5”进去,但是函数要求传递一个整形。
在一些弱类型的语言中(如 JavaScript),我可以这么定义一个函数:
function AddTwoNumbers(a, b)
{
return a + b;
}
如果我这样调用:
Sum = AddTwoNumbers(5, "5");
Javascript 自动将 5 转换成 “5” 并且返回 “55”。 这是由于 JavaScript 使用 + 号进行字符串连接。为了让它可以感知类型,你应该这么写:
function AddTwoNumbers(a, b)
{
return Number(a) + Number(b);
}
或者这样:
function AddOnlyTwoNumbers(a, b)
{
if (isNaN(a) || isNaN(b))
return false;
return Number(a) + Number(b);
}
如果我这样调用:
Sum = AddTwoNumbers(5, " dogs");
JavaScript 自动将 5 转换成 “5” 然后返回 “5 dogs”。
不是所有动态语言都像 JavaScript 一样宽容弱类型 (事实上动态语言不含蓄地暗示弱类型 (比如Python)),有一些会在进行无效类型转换时给你一个运行时错误(runtime error)
虽然它很方便,但很容易出错,只有通过debug你的程序才能确定错误。我还是比较喜欢编译器告诉我我的类型出错了。
原文地址:StackOverflow