我似乎无法找到我在静态方法中使用非静态引用的位置,代码是:
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)进行静态引用答案 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,请始终尝试文件:无效缓存...... - 它们经常出错。