Последнее поле не может быть назначено для интерфейса - PullRequest
9 голосов
/ 14 декабря 2010

У меня есть класс Product и интерфейс LargeProduct.Продукт реализует LargeProduct.

LargeProduct имеет переменную высоту, которая имеет методы получения и установки, которые должны быть реализованы в классе Product.

Переменная высоты в LargeProduct определяется следующим образом:

public int height = null;

Метод получения работает нормально:

public int getHeight() {
    return height;
}

Но метод установки не работает:

public void setHeight(int height) {
    this.height = height;
}

Ошибки:

The final field LargeProduct.height cannot be assigned
The static field LargeProduct.height should be accessed in a static way

I 'я не уверен, какую ошибку он на самом деле дает .. Я использую Eclipse, и когда я нахожу его, он выдает первую ошибку, а в нижней части окна выдает вторую ошибку.

Ответы [ 5 ]

15 голосов
/ 14 декабря 2010

Интерфейсы могут включать только константы , а не переменные общего назначения. Интерфейсы должны только содержать константы, если они действительно относятся к остальному интерфейсу, и они должны использовать SHOUTY_CASE, как и для любой другой константы. Похоже, что LargeProduct не должно иметь константу с именем height - но вместо этого ваша реализация должна объявить поле height.

Обратите внимание, что интерфейсы должны быть API-интерфейсами, показывающими возможности типов. Поля не должны быть частью API - это деталь реализация . В конце концов, кто скажет, что вы напишите getHeight и setHeight на основе простой переменной? Эти методы могут запрашивать базу данных или делегировать экземпляр другого типа. Потребитель интерфейса не должен знать или заботиться об этом.

Для получения дополнительной информации о полях в интерфейсах я предлагаю вам прочитать раздел 9.3 Спецификации языка Java :

Каждое объявление поля в теле интерфейса неявно является public, static и final. Для таких полей разрешается избыточно указывать любой или все эти модификаторы.

2 голосов
/ 14 декабря 2010

Переменная высоты в LargeProduct определяется так:

public int height = null;

Переменные, определенные в интерфейсах, являются неявно static и final, то есть константами. Вот на что жалуется компилятор.

Вы не можете определить переменную экземпляра в интерфейсе. Просто оставьте это - методы get и set гарантируют, что классы могут использоваться по назначению. Фактическая переменная является подробностью реализации, если реализующие классы.

1 голос
/ 14 декабря 2010

По умолчанию поля (переменная-член) в интерфейсе public static final

и у вас нет сеттера для final

0 голосов
/ 14 декабря 2010

Точно org.life.java! И вы не можете изменить статическую конечную переменную! Потому что это способ определения константы в Java.

0 голосов
/ 14 декабря 2010

Вы не можете присвоить значение конечному полю.Объявите высоту в Продукте как

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