java类型提升机制比较常见,但是比较隐蔽,特别是自动强转类型的时候,如果不注意就可能出错。
涉及基本元素的自动提升类型场景有:
- 不同类型进行四则运算的时候,会自动提升类型到类型最高元素的类型
- += 和 -= 会自动提升类型,然后再强转回来
- 位运算符比int类型低的会自动提升成int类型
- <<= 和>>= 会转成int类型再强转回来
- 三元操作符 ? : 会像四则运算一样自动提升类型,但是不会把强转回来
涉及到方法重载时的类型提升
在方法重载的时候,如果参数类型不严格匹配,会自动提升参数类型,这个对类对基本类型都是如此,但是涉及到可变参数的时候,可能会出现编译错误:
import java.util.*;
public class Main1{
int i=10;
public static void main(String[] args) {
Main1 s = new Main1();
s.f(1,'a');//编译正确,匹配第一个f,1提升成1.0去匹配第一个
s.f('a','b');//编译错误,编译器会提升‘a’到float,出现歧义
}
void f(float i,Character...a){}
void f(Character...a){}
}
java会自动提升类型去匹配可变参数列表,当有多个都能匹配的时候,就不能确定哪一个,从而出现编译错误。