2013-07-17 1 views
0

я объявил следующий интерфейс:Java интерфейс поле скомпилированных нежелательные модификаторы

public interface SQLSyncAble 
{ 
    boolean modified = true; 
    long id = -1; 

    static HashMap<String,SQLAction> SQLModifiers = new HashMap<String,SQLAction>(); 
    static Field[] SQL_Object_Fields = null; 
    static DataType[] TransferDataTypes = null; 
} 

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

someobject.id = 10 // The final field SQLSyncAble.id cannot be assigned. 
        //The static field SQLSyncAble.id should be accessed in a static way. 

LOL какой? «id» и «modified» не является «статическим окончанием», я могу увидеть скомпилированный файл .class (im проверен в редакторе Java-сборки и в eclipse) и действительно! Каждый раз (неважно, по eclipse или java) int в соответствующем классе все поля будут иметь модификатор «static final». Но почему?

Если я изменяю этот интерфейс на «абстрактный класс», проблема мгновенно исчезает.

... Но это только половина решения, java допускает только один из суперкласса.

Зачем мой интерфейс с нежелательными модификаторами?

+0

С приведенным кодом вы можете искать абстрактный класс, а не интерфейс. – GriffeyDog

ответ

2

По определению все поля интерфейсов отмечены static final.

У вас должен быть класс, окружающий интерфейс, если вам нужны нестатические, не конечные члены.

+0

Похоже, я должен использовать абстрактный класс, но что из причины - это поле в интерфейсе статического финала? –

0

Вы не можете изменить конечную переменную, когда когда-либо, после ее инициализации.

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

+0

Объясните, пожалуйста, пожалуйста. – hexafraction