加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 当调用静态方法返回相同类型的变量和类型本身的相同名称

发布时间:2020-12-15 08:48:49 所属栏目:Java 来源:网络整理
导读:为什么它会因下面显示的错误而失败?我不确定JLS在哪里寻找限制做这样的事情. public class A { static A foo() { return null; } public static void main(String[] args) { A A = A.foo(); }} 编译时出错 A.java:14: error: variable A might not have bee
为什么它会因下面显示的错误而失败?我不确定JLS在哪里寻找限制做这样的事情.

public class A {

    static A foo() {
        return null;
    }

    public static void main(String[] args) {
        A A = A.foo();
    }
}

编译时出错

A.java:14: error: variable A might not have been initialized
        A A = A.foo();
              ^
1 error

解决方法

变量隐藏了同名的类.这就是为什么有 naming conventions的部分原因.

正如Patricia在评论中指出的那样,这在JLS中实际上称为obscuring:

In these situations,the rules of 07002 specify that a variable will be chosen in preference to a type,and that a type will be chosen in preference to a package.

在您的情况下,您会收到编译错误,因为变量隐藏了类型,因为在方法调用之前处理了声明.这与执行以下操作相同:

public class A {
    public void foo() {
        String s = s.substring(0,s.length());
    }
}

你得到同样的错误:

A.java:3: variable s might not have been initialized
        String s = s.substring(0,s.length());
                   ^
1 error

在评论中,你说你找不到JLS说你的建筑是非法的.它本身并不违法,因为模糊的结果是.考虑两个类的情况,你也可以因为模糊而得到不需要的电话,这不是非法的,只是令人困惑:

public class A {
    public void foo() {
        System.out.println("A.foo()");
    }

    public static void main(String[] args) {
        A B = new A();
        B.foo();
    }

    public static class B {
        public static void foo() {
            System.out.println("B.foo()");
        }
    }
}

您认为输出是什么?

$javac A.java
$java A
A.foo()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读