2014-01-06 4 views
4

У меня есть интерфейс, который содержит только значения int (по сути, он очень похож на перечисление).Java - Class Поле/метод getInt

Я хочу перебирать значения интерфейса, используя следующий фрагмент кода:

for (Field x : MyInterface.class.getDeclaredFields()) 
{ 
    int y = x.getInt(x); 
    // do something with 'y'... 
} 

Как я вижу это, либо метод GetInt может быть статическим, или он не нуждается в каких-либо аргументов.

Так почему же этот метод нуждается как в «этом», так и в дополнительном аргументе?

Есть ли какой-либо правдоподобный сценарий для них быть другим?

+2

Попробуйте передать 'null' в качестве аргумента: он тоже должен работать. – sp00m

+1

@ sp00m: спасибо ... все еще не отвечает на мой вопрос, хотя ... –

+0

@barakmanos - У вас нет статических методов в интерфейсе. – TheLostMind

ответ

1
int y = x.getInt(x); 

Это на самом деле неправильно и не имеет никакого смысла. JavaDoc из Field.getInt говорит следующее:

Параметры: OBJ - объект для извлечения значения INT из

Возвращает: значение поля преобразуется к типу INT

A Field «глобально» определен для класса. Если вы хотите получить доступ к значению поля определенного экземпляра этого класса, то вам необходимо предоставить этот экземпляр методу getField(Object).

Он даже идет дальше и говорит:

Выдает:

IllegalArgumentException - если указанный объект не является экземпляр класса или интерфейса объявляющего основного поля (или подкласс или его реализатор) , или если значение поля не может быть преобразовано в тип int путем расширения преобразования.

NullPointerException - если указанный объект имеет значение null, а поле является полем экземпляра.

Таким образом, вы не можете обеспечить null, как это было предложено в комментариях, если поле не является static поля. Вы также можете не использовать само поле (x) в качестве параметра, так как оно не является экземпляром этого класса.

В вашем конкретном случае, когда поле определено в пределах interface, все поля автоматически становятся static final. Таким образом, вы можете указать null в качестве параметра, поскольку дополнительной информации не требуется.

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

+0

Пожалуйста, внимательно прочитайте код в вопросе: «x» - это экземпляр класса Field. Чтобы вызвать метод getInt, я должен использовать этот экземпляр, так как метод не является статическим. Итак, почему этот метод не статичен, или, альтернативно, почему он принимает аргумент? –

+0

@barakmanos Я так и ответил. В конце моего ответа я добавил более конкретную информацию, поэтому она становится более понятной. – noone

+0

"само поле (x) не является экземпляром этого класса"? Когда я объявляю «Поле x», какой класс является «x» экземпляром? –