如何解决“无法对非静态字段或方法进行静态引用”?

时间:2011-04-07 12:37:36

标签: java static-methods

我似乎无法找到我在静态方法中使用非静态引用的位置,代码是:

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);
}

编译器说:无法从类型Item

中对非静态方法getItemStatusFromName(String)进行静态引用

5 个答案:

答案 0 :(得分:2)

代码在我的电脑上编译得很好。如果在Eclipse或Netbeans等IDE中工作,请尝试清理项目并再次编译。

答案 1 :(得分:0)

首先,请考虑使用不同类型的商店。

这是一个我掀起的一个例子,它做了一些有效的事情,并且肯定会编译并运行:

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"));
}
}

我放入的更改是修改地图以使用枚举而不是字符串,并返回枚举而不是字符串。但这取决于您和您的编码要求。

这段代码绝对适用于我。

答案 2 :(得分:0)

您的代码看起来非常好(除了不使用泛型和扩展for循环等1.5功能)。如果我粘贴并运行它,它的工作原理。所以对我来说,它看起来像一个类路径问题:可能有一个版本的Item没有静态getItemStatusFromName,你的编译器试图使用这个版本而不是你的版本。如果您已将Item打包到JAR中并在其他地方引用JAR,那么首先更新相应的JAR。

如果您不确定,那么最好的猜测是通过ClassLoader c = Item.class.getClassLoader();访问Item的类加载器,然后使用调试器找出类加载器从哪里获取文件。

答案 3 :(得分:0)

首先,你应该考虑为什么你班上的一切都是静态的。您应该考虑static == Class(非实例变量)。但是,您的代码实例是HashMap。基于类的名称,您应该删除static关键字,将构造函数中的STATUS_NEW添加到ITEM_STATUSES中并继续开发。

BTW,如果您使用的是Java 5.0或更高版本,请尝试以下方法:

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

答案 4 :(得分:0)

您确定,类路径中只有一个Item类吗?使用IDE搜索类型Item - 可能是一些配置错误。你使用哪个IDE?如果是Idea,请始终尝试文件:无效缓存...... - 它们经常出错。