No se puede hacer una referencia estática al método no estático
Construyendo una aplicación multilenguaje en Java. Aparece un error al insertar un valor de cadena desde R.string
un archivo XML de recursos:
public static final String TTT = (String) getText(R.string.TTT);
Este es el mensaje de error:
Error: no se puede hacer una referencia estática al método no estático getText(int) del tipo Contexto
¿Cómo se produce esto y cómo puedo solucionarlo?
Como getText()
no es estático, no puedes llamarlo desde un método estático.
Para entender por qué, hay que entender la diferencia entre los dos.
Los métodos de instancia (no estáticos) funcionan en objetos que son de un tipo particular (la clase). Estos se crean con lo nuevo así:
SomeClass myObject = new SomeClass();
Para llamar a un método de instancia, lo llama en la instancia ( myObject
):
myObject.getText(...)
Sin embargo, un método/campo estático solo se puede llamar directamente en el tipo, digamos así:
La afirmación anterior no es correcta. También se pueden hacer referencia a campos estáticos con una referencia de objeto como, myObject.staticMethod()
pero no se recomienda porque no deja claro que son variables de clase.
... = SomeClass.final
Y los dos no pueden trabajar juntos ya que operan en espacios de datos diferentes (datos de instancia y datos de clase)
Déjame intentar explicarte. Considere esta clase (psuedocódigo):
class Test {
string somedata = "99";
string getText() { return somedata; }
static string TTT = "0";
}
Ahora tengo el siguiente caso de uso:
Test item1 = new Test();
item1.somedata = "200";
Test item2 = new Test();
Test.TTT = "1";
¿Cuáles son los valores?
Bien
in item1 TTT = 1 and somedata = 200
in item2 TTT = 1 and somedata = 99
En otras palabras, TTT
es un dato compartido por todas las instancias del tipo. Entonces no tiene sentido decir
class Test {
string somedata = "99";
string getText() { return somedata; }
static string TTT = getText(); // error there is is no somedata at this point
}
Entonces la pregunta es ¿por qué TTT es estático o por qué getText() no es estático?
Elimine el static
y debería superar este error, pero sin comprender qué hace su tipo, es solo una tirita hasta el siguiente error. ¿ Cuáles son los requisitos que getText()
requieren que sea no estático?
Context
Ya hay algunas buenas respuestas con explicaciones de por qué la combinación del método no estático getText()
no se puede utilizar con su archivo static final String
.
Una buena pregunta es: ¿por qué quieres hacer esto? Está intentando cargar a String
desde su strings
recurso y completar su valor en un public static
campo. Supongo que esto es para que algunas de tus otras clases puedan acceder a él. Si es así, no es necesario hacer esto. En lugar de eso, pasa Context
a tus otras clases y llama context.getText(R.string.TTT)
desde ellas.
public class NonActivity {
public static void doStuff(Context context) {
String TTT = context.getText(R.string.TTT);
...
}
}
Y para llamar a esto desde tu Activity
:
NonActivity.doStuff(this);
Esto le permitirá acceder a su String
recurso sin necesidad de utilizar un public static
campo.
para otros que encuentren esto en la búsqueda:
A menudo obtengo este cuando accidentalmente llamo a una función usando el nombre de la clase en lugar del nombre del objeto. Esto suele suceder porque les doy nombres demasiado similares :P
es decir:
MyClass myclass = new MyClass();
// then later
MyClass.someFunction();
Obviamente, este es un método estático. (bueno para algunas cosas) Pero lo que realmente quería hacer (en la mayoría de los casos era)
myclass.someFunction();
Es un error muy tonto, pero cada dos meses, pierdo unos 30 minutos jugando con las variables en las definiciones de "MiClase" para descubrir qué estoy haciendo mal cuando en realidad es solo un error tipográfico.
Nota curiosa: el desbordamiento de pila resalta la sintaxis para que el error sea realmente obvio aquí.