在Java中构建多语言应用程序。从R.string
资源XML文件插入String值时出现错误:
public static final String TTT = (String) getText(R.string.TTT);
这是错误信息:
错误:无法对类型Context中的非静态方法getText(int)进行静态引用
这是什么原因造成的,我该怎样解决它?
在Java中构建多语言应用程序。从R.string
资源XML文件插入String值时出现错误:
public static final String TTT = (String) getText(R.string.TTT);
这是错误信息:
错误:无法对类型Context中的非静态方法getText(int)进行静态引用
这是什么原因造成的,我该怎样解决它?
getText()
不是静态方法,因此您无法从静态方法中调用它。
要理解原因,您必须了解两者之间的区别。
实例 (非静态) 方法适用于特定类型(即类)的对象。这些对象通过如下方式创建:
SomeClass myObject = new SomeClass();
要调用实例方法,您需要在实例(myObject
)上调用它:
myObject.getText(...)
然而,静态方法/字段只能直接在类型上调用,像这样:
之前的说法是不正确的。你也可以通过对象引用来引用静态字段,如 myObject.staticMethod()
,但这是不鼓励的,因为它不能清楚地表明它们是类变量。
... = SomeClass.final
两者不能同时使用,因为它们操作的是不同的数据空间(实例数据和类数据)。
让我试着解释一下。考虑这个类(伪代码):
class Test {
string somedata = "99";
string getText() { return somedata; }
static string TTT = "0";
}
现在我有以下用例:
Test item1 = new Test();
item1.somedata = "200";
Test item2 = new Test();
Test.TTT = "1";
这些值是什么?
嗯
in item1 TTT = 1 and somedata = 200
in item2 TTT = 1 and somedata = 99
换句话说,TTT
是所有该类型实例共享的数据。因此,说
class Test {
string somedata = "99";
string getText() { return somedata; }
static string TTT = getText(); // error there is is no somedata at this point
}
问题是为什么TTT是静态的,或者为什么getText()不是静态的?
去掉static
就可以解决这个错误,但是在不了解你的类型的情况下,这只能是一个权宜之计,直到下一个错误出现。有什么要求需要使getText()
非静态吗?
已经有一些很好的答案解释了为什么非静态的Context
方法getText()
不能与你的static final String
一起使用。
一个好问题是:你为什么想这样做?你试图从你的strings
资源中加载一个 String
,并将其值填充到一个public static
字段中。我假设这样做是为了让其他类可以访问它?如果是这样,那么没有必要这样做。相反,将一个Context
传递到你的其他类中,并在它们内部调用context.getText(R.string.TTT)
即可。
public class NonActivity {
public static void doStuff(Context context) {
String TTT = context.getText(R.string.TTT);
...
}
}
然后从您的Activity
中调用此函数:
NonActivity.doStuff(this);
这将允许您访问您的String
资源,而无需使用public static
字段。
String a[] = context.getTextArray(R.array.myStringArray);
来操作字符串数组,但是出现了错误The method getTextArray(int) is undefined for the type Context
。为什么它对getText有效而对getTextArray无效呢? - auspicious99对于那些通过搜索找到这篇文章的人:
当我意外使用了类名而不是对象名调用函数时,我经常遇到这个问题。这通常发生在我给它们起的名字太相似时:P
例如:
MyClass myclass = new MyClass();
// then later
MyClass.someFunction();
显然这是一个静态方法(适用于某些情况)。 但我真正想做的事情(在大多数情况下)是:
myclass.someFunction();
这是一个非常愚蠢的错误,但每隔几个月,我都会浪费大约30分钟在"MyClass"定义中搞清楚我做错了什么,而实际上只是一个打字错误。
有趣的是:stackoverflow会突出显示语法,使这个错误非常明显。
public final String TTT = (String) getText(R.string.TTT);
getText是Activity的成员,因此必须在“this”存在时调用它。您的静态变量在创建Activity之前加载类时初始化。
由于您希望该变量从资源字符串初始化,因此不能为静态。如果要使其为静态,则可以使用String值进行初始化。
这个问题并不新,现有的答案提供了一些很好的理论背景。我只想添加一个更加实用的答案。
getText是Context抽象类的一个方法,为了调用它,需要一个其子类(Activity、Service、Application或其他)的实例。问题在于,公共静态常量在创建任何Context实例之前就已经初始化了。
有几种解决方法:
是的,您可以在静态方法中调用非静态方法,因为我们需要记住首先'我们可以创建一个对象,该对象的类可以轻松地调用非静态方法进入静态方法
getString()
方法请求它们。这样,您的应用程序就可以适应用户更改所选择的语言。 - CommonsWare