什么是类型安全(Type-safe)

类型安全意味着编译器在编译的时候会验证类型,如果你尝试将一个错误的类型分配给一个变量时,会抛出一个错误。

下面是一个例子:

// 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

你可能感兴趣的:(什么是类型安全(Type-safe))