Java中的静态类型检测、“误判”及避免方法

Java编译器通过检查程序的源代码来验证类型安全,称为静态类型检测(Static checking)。无论是对于新手还是老鸟,静态检测能够避免程序员因为失误而引起的语法错误/类名或函数名错误/参数错误等,避免了将错误带入到运行阶段,可提高程序正确性/健壮性,例如:

//Error!
String five = 5;

编译器会给出以下信息:

test.java.2:incompatible types

found:int

required:java.lang.String

String five = 5;

编译器识别变量five的类型是String,但我们赋值是int,编译器便会给出警告(一般是红色波浪线)。

但是由于静态类型是在编译阶段前进行检查,难免会发生“误判”,下面举出一个例子:

class A {
    A self{
        return this;
        }
public void printA() {
		System.out.println("A");
	}
}
 
class B extends A {
	public void printB() {
		System.out.println("B");
	}
}

由于B继承了A的方法,调用new B().self()将返回B对象;但是由于self()方法被声明将返回A对象,所以编译器会认为只要使用self()方法,就会返回A对象。

这导致了一个问题:由于编译器在编译前会认为new B().self()会返回A对象,所以new B().self().printA();会被判定为合法的语句,而new B().self().printB();会被判定为非法语句。

//编译器认为是错误,但实际是正确的
new B.self().printB();

当然,程序员可以无视编译器的错误警告,但要是程序员也犯错了呢?所以为了避免编译器“误判”同时检测我们编写的代码是否正确,我们可以使用类型转换,例如上述例子中我们可以将new B().self().printB();改写为:

((B) new B().self()).printB();

此时,编译器就不会误判了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值