我有这个代码,
class Test
{
public static void main(String args[])
{
String x = "Hello";
String y = "Bye!";
System.out.printf("This is %s, this is %s", x);
}
}
Run Code Online (Sandbox Code Playgroud)
并且java编译器编译它,但它显然有错误.我的问题是,为什么编译器没有发现这个错误?如果它甚至无法捕捉到这个小错误,静态类型的好处在哪里?
printf()将String和vararg对象数组作为参数.您的程序传递符合这些参数类型的参数,因此编译器很高兴.
例如,如果您这样做,编译器将拒绝您的方法调用
Integer a = 23;
System.out.printf(a, x);
Run Code Online (Sandbox Code Playgroud)
因为Integer不是String.
您似乎认为静态类型使运行时错误无法实现.事实并非如此.编译器不知道printf()的作用以及%sString中的含义.它不知道该数量%s应该与传递给该方法的参数数量相匹配.即使它确实如此,您也可以将String类型的变量和Object []类型的变量传递给方法,该方法的长度和值仅在运行时已知,而不是在编译时.例如:
String s = readPatternFromUser();
Object o = readFirstArgFromUser();
System.out.print(s, o);
Run Code Online (Sandbox Code Playgroud)