在看《Head First Java》时,提到Java是个强类型的语言,代表不能容许变量保存类型的数据…Why?
A:类型擦除?
1. 基础概念:
Program Errors
- trapped errors:导致程序终止执行,如除0,Java中数组越界访问
- untrapped errors: 出错后继续执行,但可能出现任意行为。如C里的缓冲区溢出、Jump到错误地址
Forbidden Behaviours
在语言设计时,可以定义一组forbidden behaviors, 它必须包括所有untrapped errors, 但可能包含trapped errors。
Well behaved、ill behaved
- well behaved: 如果程序执行不可能出现forbidden behaviors, 则为well behaved。
- ill behaved: 否则为ill behaved…
2. 强、弱类型,静态、动态类型
- 强类型strongly typed: 如果一种语言的所有程序都是well behaved——即不可能出现forbidden behaviors,则该语言为strongly typed。
- 弱类型weakly typed: 否则为weakly typed。比如C语言的缓冲区溢出,属于trapped errors,即属于forbidden behaviors..故C是弱类型
eg:弱类型语言,类型检查更不严格,如偏向于容忍隐式类型转换。譬如说C语言的int可以变成double。 这样的结果是:容易产生forbidden behaviours,所以是弱类型的
- 静态类型 statically: 如果在编译时拒绝ill behaved程序,则是statically typed;
- 动态类型dynamiclly: 如果在运行时拒绝ill behaviors, 则是dynamiclly typed。
3. 误区
大家觉得C语言要写int a, int b之类的,Python不用写(可以直接写a, b),所以C是静态,Python是动态。这么理解是不够准确的。譬如Ocaml是静态类型的,但是也可以不用明确地写出来。Ocaml是 静态隐式类型
静态类型可以分为两种:
- 如果类型是语言语法的一部分,则是explicitly typed显式类型;
- 如果类型通过编译时推导,是implicity typed隐式类型, 比如ML和Haskell
4. 例子
无类型: 汇编
弱类型、静态类型 : C/C++
弱类型、动态类型检查: Perl/PHP
强类型、静态类型检查 :Java/C#
强类型、动态类型检查 :Python, Scheme
静态 显式类型 :Java/C
静态隐式类型 :Ocaml, Haskell
5. 其他解释
强弱是说互相转化的能力,Java的类型几乎不能相互转换,所以很强。
强类型就是強制你一定要有个类型,还要看他们之间互相转换的难易度。弱类型反之。。。
6. 结论
与Java中的伪“泛型”相关,运行时的类型会被擦除。
向对象发送消息时,被调用的确切类型的方法直到运行时才会被确定。
编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查,但是并不知道将被执行的确切代码。(无法提供此类保证的语言被称为弱类型的)