Как я могу решить Не могу сделать статическую ссылку на нестатическое поле или метод?

Кажется, я не могу найти, где я использую нестатическую ссылку в своем статическом методе, код:

public class Item {

public static final Map ITEM_STATUSES = new HashMap();

static {
  ITEM_STATUSES.put(STATUS_NEW, "New");
}

public static String getItemStatusFromName(final String p_itemStatusName) {
  Iterator statusIterator = Item.ITEM_STATUSES.entrySet().iterator();
  while (statusIterator.hasNext()) {
    Entry statusEntry = (Entry)statusIterator.next();
    if (((String)statusEntry.getValue()).equals(p_itemStatusName)) {
      return (String)statusEntry.getKey();
    }
   }
  return "";
 }
}

и в другом классе

private void getName(){
  String itemStatus = Item.getItemStatusFromName(p_itemStatusName);
}

Компилятор говорит: Невозможно сделать статическую ссылку на нестатический метод getItemStatusFromName(String) из типа Item


person Andrija    schedule 07.04.2011    source источник
comment
Уверены, что сохранили и скомпилировали другой класс?   -  person BalusC    schedule 07.04.2011
comment
Да, сохранил, обновил, работает.   -  person Andrija    schedule 07.04.2011
comment
Разве у вас нет старой копии класса Item в другом пакете? В любом случае, код выглядит нормально, просто он сводится к тому, что вы на самом деле не запускаете код, на который вы сейчас смотрите.   -  person BalusC    schedule 07.04.2011
comment
Вы можете попробовать прокомментировать все содержимое getItemStatusFromName() и раскомментировать строку за строкой, чтобы определить, какая строка вызывает ошибку.   -  person klonq    schedule 07.04.2011
comment
чтобы решить эту проблему, вы можете попробовать создать экземпляр класса элемента и вызвать get... для экземпляра, но ошибка кажется странной.   -  person kostja    schedule 07.04.2011
comment
Если вы имеете в виду, ссылаюсь ли я на неправильный класс Item, ответ - нет; попробовал это, CTRL+щелчок в Eclipse открывает правильный класс с правильной подписью.   -  person Andrija    schedule 07.04.2011
comment
Eclipse может потребоваться перезапуск/полная перестройка. Код, опубликованный в вопросе, выглядит нормально (хотя вместо этого я бы использовал перечисление, но это другая проблема;)).   -  person BalusC    schedule 07.04.2011
comment
У вас нет участника с именем Item, не так ли?   -  person vickirk    schedule 07.04.2011


Ответы (5)


Код отлично компилируется на моем компьютере. Если вы работаете в среде IDE, такой как Eclipse или Netbeans, попробуйте очистить проект и скомпилировать его снова.

person janhink    schedule 07.04.2011

Во-первых, рассмотрите возможность использования другого типа магазина.

Вот пример, который я на скорую руку делает то же самое, и определенно компилируется и запускается:

import java.util.HashMap;
import java.util.Map;

class ItemMap {
static Map<String, String> statuses = new HashMap<String, String>();

static {
    statuses.put("STATUS_NEW", "New");
}

public static String getStatusFromString(String s) {
    for (Map.Entry<String, String> e : statuses.entrySet()) {
        if (e.getValue().equals(s)) {
            return e.getKey();
        }
    }
    return "";
}
}

public class Item {
public static void main(String[] args) {
    System.out.printf("Status for 'New': %s%n",
            ItemMap.getStatusFromString("New"));
}
}

Изменения, которые я бы внес, заключались бы в том, чтобы изменить карту, чтобы использовать перечисление вместо строки и вернуть перечисление вместо строки. Но это зависит от вас и ваших требований к кодированию.

Этот код определенно работает для меня.

person Joseph Ottinger    schedule 07.04.2011

Ваш код выглядит прекрасно (кроме того, что вы не используете функции 1.5, такие как дженерики и расширенные циклы for). Если я вставляю и запускаю его, он работает. Так что для меня это похоже на проблему пути к классам: может быть версия Item, которая не имеет статического getItemStatusFromName, и ваш компилятор пытается использовать эту версию вместо вашей версии. Если вы упаковали Item в JAR и ссылаетесь на JAR где-то еще, сначала обновите соответствующий JAR.

Если вы не уверены, то лучше всего получить доступ к загрузчику классов Item через ClassLoader c = Item.class.getClassLoader();, а затем использовать отладчик, чтобы узнать, откуда загрузчик классов извлекает свои файлы.

person nd.    schedule 07.04.2011

Во-первых, вы должны подумать о том, почему все в вашем классе статично. Вы должны рассмотреть static == Class (переменные без экземпляра). Однако ваш код создает экземпляр HashMap. Основываясь на названии класса, вы должны удалить ключевое слово static, добавить STATUS_NEW в конструкторе в ITEM_STATUSES и продолжить разработку.

Кстати, если вы используете Java 5.0 или выше, попробуйте следующее:

Map<Object, String> map = new HashMap<Object, String>();
for (String str : map.values()) {
    srt.doSomething();
}

Удачи!

person Mr. Nobody    schedule 07.04.2011

Вы уверены, что у вас есть только один класс Item в пути к классам? Найдите тип Item в IDE - возможно, какая-то неправильная конфигурация. Какую IDE вы используете? Если идея, всегда попробуйте Файл : Invalidate Caches... — они часто ошибаются.

person Arne Burmeister    schedule 07.04.2011