【问题标题】:How can I resolve "Cannot make a static reference to the non-static field or method"?如何解决“无法对非静态字段或方法进行静态引用”?
【发布时间】:2011-04-07 12:37:36
【问题描述】:

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

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) 进行静态引用

【问题讨论】:

  • 确定保存并编译了其他类?
  • 是的,保存,刷新,作品。
  • 您在不同的包中没有Item 类的旧副本吗?无论如何,代码看起来都不错,只是归结为您并没有真正运行您当前正在查看的代码。
  • 您可以尝试注释 getItemStatusFromName() 的全部内容并逐行取消注释以确定导致错误的行。
  • Eclipse 可能需要重新启动/完全重建。问题中发布的代码看起来不错(尽管我会改用枚举,但这是一个不同的问题;))。

标签: java static-methods


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    这是我创建的一个示例,它实际上做了相同的事情,并且肯定可以编译和运行:

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

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

    这段代码绝对适合我。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        首先,您应该考虑一下为什么类中的所有内容都是静态的。您应该考虑 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();
        }
        

        祝你好运!

        【讨论】:

          【解决方案5】:

          您确定,您的类路径中只有一个Item 类吗?在 IDE 中搜索类型 Item - 可能是一些错误配置。您使用哪个 IDE?如果是 Idea,请始终尝试 File : Invalidate Caches ... - 它们通常是错误的。

          【讨论】:

            猜你喜欢
            • 2019-05-07
            • 1970-01-01
            • 2021-11-04
            • 1970-01-01
            • 2011-06-25
            相关资源
            最近更新 更多