Как я могу решить "Невозможно сделать статическую ссылку на нестатическое поле или метод"? - PullRequest
4 голосов
/ 07 апреля 2011

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

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

Ответы [ 5 ]

2 голосов
/ 07 апреля 2011

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

0 голосов
/ 07 апреля 2011

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

0 голосов
/ 07 апреля 2011

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

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

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

Удачи!

0 голосов
/ 07 апреля 2011

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

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

0 голосов
/ 07 апреля 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"));
}
}

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

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

...