Java:调用与接口字段冲突的抽象类的非静态字段

SOU*_*E77 1 java inheritance interface abstract non-static

如何显示抽象类 Confused("ConfusedValue") 中“name”非静态字段的值?我尝试了3种方法,但都有错误。我只能显示 Confuslable 的名称值(“ConfusableValue”)

interface Confusable {
    String name = "ConfusableValue";

    String confuse();
}

abstract class Confused {
    String name = "ConfusedValue";

    abstract Object confuse();
}

public class Test extends Confused implements Confusable {
    public static void main(String[] args) {
        Test a = new Test();
        // --- OK
        System.out.println("Confusable.name: " + Confusable.name);
        // --- Errors
        System.out.println("name: " + name); // Error : The field name is ambiguous
        System.out.println("Confused.name: " + Confused.name); // Error : Cannot make a static reference to the non-static field Confused.name
        System.out.println("a.name: " + a.name); // Error : The field a.name is ambiguous
    }
}
Run Code Online (Sandbox Code Playgroud)

Sil*_*olo 5

字段名称不会被继承。他们只是互相影子。这是编译器关心的问题,但就运行时而言,它们都是独立存在的,只是碰巧共享一个名称。

因此,我们只需要使类型对于编译器来说看起来正确,并且我们可以通过显式向上转换来做到这一点。这些是向上转换(即扩大转换),因此它们是安全的并且保证会成功。

System.out.println("The method confuse returns: " + ((Confused)a).name);
System.out.println("The method confuse returns: " + ((Confusable)a).name);
Run Code Online (Sandbox Code Playgroud)