2013-09-23 5 views
0

Вот код У меня есть три интерфейсаУ меня есть код Java, не могу понять интерфейс

interface i1{ 
int x=1; 
} 
interface i2{ 
int x=2; 
} 
interface i3{ 
int x=3; 
} 
class A implements i1,i2,i3{ 
system.out.println(x); // It shows Field is ambgous 
} 

Как ответить на этот вопрос или как преодолеть эту проблему.

+1

Как вы ожидаете, что компилятор сделать выбор между 3 различными переменными с тем же именем? Префикс имени переменной с именем интерфейса. : 'i3.x'. –

ответ

5

Как ответить на этот вопрос или как преодолеть эту проблему.

Не используйте поля в интерфейсах, или если вы должны использовать их, и они обязательно имеют те же имена, только полностью квалифицировать их:

System.out.println(i3.x); 

Обратите внимание, что с import static, причина «краткости» для импорта интерфейсов, содержащих константы, удалена - интерфейсы должны действительно быть реализованы только по истинным поведенческим причинам. См. «Эффективное Java 2-е издание» для получения дополнительных рекомендаций по этому вопросу.

0

Это связано с тем, что одно и то же поле определено во всех интерфейсах, поэтому оно не знает, какое поле использовать для этих 3.

  • Вам нужно будет указать имя интерфейса.
  • Код должен быть в каком-либо блоке или методе init.
  • его System.out.println и не system

Также ваши имена типов должны начинаться с прописных leters

interface I1{ 
int x=1; 
} 
interface I2{ 
int x=2; 
} 
interface I3{ 
int x=3; 
} 
class A implements I1,I2,I3{ 
static{ 
    System.out.println(I1.x); 
} 

} 
0

Во всех переменных 3 интерфейсе х есть, поэтому она показывает неоднозначной. Компилятор смущает печатать, какие х из i1 или i2 или i3

0

Интерфейсы предназначены для демонстрации структуры классов. Если вы должны объявлять поля в нескольких интерфейсах и использовать все эти интерфейсы в одном классе, вы должны явно указать, какой интерфейс вы используете для этой переменной.

System.out.println(i3.x); 

Вы также можете использовать extends ключевое слово в ваших интерфейсов, чтобы уменьшить неоднозначность путем создания наследования.

interface i1{int x=1;} 
interface i2 extends i1 {...} 
interface i3 extends i2 {...} 
class A implements i3{...} 

Класс A должен реализовать все функции, объявленные в i1, i2 и i3.

0

Не делайте этого. Это называется Постоянный интерфейс Antipattern. Или просто используйте полные имена.

0

* прочный текст * хотя ответ на этот вопрос предоставлен многими.

но есть подробный анализ.

interface I1{ 
    int x=1; 
    } 
    interface I2{ 
    int x=2; 
    } 
    interface I3{ 
    int x=3; 
    } 
    class A implements I1,I2,I3{ 
    static{ 
    System.out.println(I1.x); 
    } 

    } 

целое число x представляет собой конечное целое число x. компилятор внутренне конвертировать его в качестве окончательного означает относится к нему как к константе.

поэтому, когда пользователь печатает значение x, компилятор дает для этого неоднозначную ошибку.

Для практической реализации используйте инструмент -javap, который находится в jdk.

использование: javap I1

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