为什么这会导致“字段名称不明确”错误?

时间:2012-02-24 12:12:25

标签: java interface compiler-errors

以下是代码:

public class MyClass implements Inreface1, Inreface2 {
    public MyClass() {
        System.out.println("name is :: " + name);
    }

    public static void main(String[] args) {
        new MyClass();
    }
}
//Interface1
public interface Inreface1 {
    public String name="Name";
}
 //Interface2
public interface Inreface2 {
    public String name="Name";
}

以下是导致的错误:

  

字段名称不明确

有什么问题?什么是模棱两可的?

6 个答案:

答案 0 :(得分:7)

您的类正在实现两个接口,并且在这两个接口上定义了变量name。因此,当您在班级中调用name时,Java无法确定变量是否引用Interface1.nameInterface.name

这是你代码中的问题......

答案 1 :(得分:1)

MyClass实现了两个接口,它们都有一个name变量。在MyClass的构造函数中,Java不知道要选择哪个name - 来自Inreface1的那个或来自Inreface2的那个。你可以明确告诉它:

public MyClass() {
    System.out.println("name is :: " + Inreface1.name);
}

答案 2 :(得分:1)

看看你的代码:

System.out.println("name is :: " + name);

编译器应使用哪个“名称”?我很暧昧,因为可能是Inreface1.name或Inreface2.name。 如果通过指定一个“名称”来清除歧义,则错误应该消失。例如:

System.out.println("name is :: " + Inreface1.name);

答案 3 :(得分:0)

看起来你指的是同一个变量。

我认为编译器不知道您尝试传递的值。您是否尝试更改字段变量?

答案 4 :(得分:0)

  

什么是含糊不清的?

     

如果接口继承了两个具有相同名称的字段   因为,例如,它的两个直接超接口声明了字段   使用该名称,然后会产生一个模棱两可的成员。任何使用   这个模糊的成员将导致编译时错误。因此在   例如:

   interface BaseColors {
        int RED = 1, GREEN = 2, BLUE = 4;
    }
    interface RainbowColors extends BaseColors {
        int YELLOW = 3, ORANGE = 5, INDIGO = 6, VIOLET = 7;
    }
    interface PrintColors extends BaseColors {
        int YELLOW = 8, CYAN = 16, MAGENTA = 32;
    }
    interface LotsOfColors extends RainbowColors, PrintColors {
        int FUCHSIA = 17, VERMILION = 43, CHARTREUSE = RED+90;
    }
  

接口LotsOfColors继承了两个名为YELLOW的字段。这是   只要接口不包含任何引用,就可以了   简单的名字到黄色领域。 (这样的参考可能发生在   字段的变量初始值设定项。)

     

即使是界面PrintColors   将值3赋予黄色而不是值8,a   在LotsOfColors界面中引用字段YELLOW仍然是   被认为是模棱两可的。

答案 5 :(得分:0)

另一点是接口中不允许实例变量。您的公共字符串变为常量:public static String name; - 你得到两次。具有相同名称/类型的多个常量肯定是模糊的。