2012-02-24 3 views
0

Вот код:Почему это вызывает ошибку «Имя поля неоднозначно»?

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"; 
} 

Здесь ошибка это вызывает:

Имя поля неоднозначна

В чем проблема? Что неоднозначно?

+3

* «Я стараюсь, но не могу найти многословие» * - [Я тебе не верю] (http://i.imgur.com/eQBee.png). –

+0

@alextsc - вы скупы;) – pap

+0

Мое первое, хотя было: «Меня не волнует двусмысленность, но как _hell_ не жалуется Java на _fields_ в _interfaces._» 1.8 просто продолжает давать, я думаю, – RecursiveExceptionException

ответ

7

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

Это проблема в вашем коде ...

+0

thnx для ответа, но что двусмысленно? –

+2

http://www.thefreedictionary.com/ambiguous – nhaarman

+3

и способ исправить это, чтобы присвоить ему имя класса: '' name is "+ Inreface1.name' – Thilo

1

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

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

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

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

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, а ссылки на поле YELLOW в пределах интерфейса LotsOfColors будет по-прежнему be считается неоднозначным.

1

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

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

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

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

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

Смежные вопросы