Java : 调用与接口字段冲突的抽象 class 的非静态字段
Java : call a non-static field of an abstract class in conflict with an interface's field
如何从抽象 class Confused("ConfusedValue") 中显示“name”非静态字段的值?
我尝试了 3 种方法,但都有错误。我只能显示 Confuslable 的名称 value("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
}
}
不继承字段名。他们只是互相影子。这是编译器关心的问题,但就运行时而言,它们都是独立存在的,只是碰巧共享一个名称。
所以我们只需要让类型看起来适合编译器,我们可以通过显式向上转换来做到这一点。这些是向上转换(即扩大转换),因此它们是安全的并保证成功。
System.out.println("The method confuse returns: " + ((Confused)a).name);
System.out.println("The method confuse returns: " + ((Confusable)a).name);
如何从抽象 class Confused("ConfusedValue") 中显示“name”非静态字段的值? 我尝试了 3 种方法,但都有错误。我只能显示 Confuslable 的名称 value("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
}
}
不继承字段名。他们只是互相影子。这是编译器关心的问题,但就运行时而言,它们都是独立存在的,只是碰巧共享一个名称。
所以我们只需要让类型看起来适合编译器,我们可以通过显式向上转换来做到这一点。这些是向上转换(即扩大转换),因此它们是安全的并保证成功。
System.out.println("The method confuse returns: " + ((Confused)a).name);
System.out.println("The method confuse returns: " + ((Confusable)a).name);