Почему это вызывает ошибку «Имя поля неоднозначно»? - PullRequest
0 голосов
/ 24 февраля 2012

Вот код:

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 ]

7 голосов
/ 24 февраля 2012

Ваш класс реализует два интерфейса, и на обоих из них определена переменная name.Таким образом, когда вы вызываете name в своем классе, Java не может определить, относится ли переменная к Interface1.name или Interface.name.

В этом проблема вашего кода ...

1 голос
/ 24 февраля 2012

Посмотрите на ваш код:

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

Какое "имя" должен использовать компилятор?Я неоднозначен, потому что может быть Inreface1.name или Inreface2.name.Если вы устраните неоднозначность, указав одно «имя», ошибка должна исчезнуть.Например:

System.out.println("name is :: " + Inreface1.name);
1 голос
/ 24 февраля 2012

Класс MyClass реализует два интерфейса, каждый из которых имеет переменную name.В конструкторе MyClass Java не знает, какой name выбрать - тот из Inreface1 или тот из Inreface2.Вы могли бы сказать это явно:

public MyClass() {
    System.out.println("name is :: " + Inreface1.name);
}
0 голосов
/ 24 февраля 2012

Другое дело, что переменные экземпляра недопустимы в интерфейсах. Ваша открытая строка превращается в константу: public static String name; - который вы получаете два раза. Более чем одна константа с тем же именем / типом определенно неоднозначна.

0 голосов
/ 24 февраля 2012

что неоднозначно?

Если два поля с одинаковым именем наследуются интерфейсом потому что, например, два его прямых суперинтерфейса объявляют поля с этим именем, то получается один неоднозначный член. Любое использование этот неоднозначный член приведет к ошибке времени компиляции. Таким образом, в Пример:

   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 наследует два поля с именем ЖЕЛТЫЙ. Это все в порядке, пока интерфейс не содержит ссылки на простое имя в поле ЖЕЛТЫЙ. (Такая ссылка может произойти в инициализатор переменной для поля.)

Даже если интерфейс PrintColors должны были дать значение 3 ЖЕЛТЫЙ, а не значение 8, а ссылка на поле YELLOW в интерфейсе LotsOfColors все равно будет считается неоднозначным.

0 голосов
/ 24 февраля 2012

Похоже, вы ссылаетесь на одну и ту же переменную.

Я думаю, что компилятор не знает, какое значение вы пытаетесь передать. Вы пытались изменить переменную поля?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...