静态打字的好处在哪里,也就是为什么不抓住这个?Java的

Edg*_*ian -6 java

我有这个代码,

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编译器编译它,但它显然有错误.我的问题是,为什么编译器没有发现这个错误?如果它甚至无法捕捉到这个小错误,静态类型的好处在哪里?

JB *_*zet 7

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)

  • 字符串值不会被解释/编译/评估为Java代码.它们只是......字符串值. (2认同)