Ошибка: Не удается создать статическую ссылку на нестатический метод getText(int) из контекста типа
Чем это вызвано и как я могу это решить?
Переведено автоматически
Ответ 1
Поскольку getText() является нестатическим, вы не можете вызвать его из статического метода.
Чтобы понять почему, вы должны понимать разницу между ними.
Методы экземпляра (нестатические) работают с объектами определенного типа (класса). Они создаются с помощью new следующим образом:
SomeClassmyObject=newSomeClass();
Чтобы вызвать метод экземпляра, вы вызываете его в экземпляре (myObject):
myObject.getText(...)
Однако статический метод / поле можно вызвать только для типа напрямую, скажем так: Предыдущее утверждение неверно. Можно также ссылаться на статические поля с помощью ссылки на объект типаmyObject.staticMethod() но это не рекомендуется, потому что это не дает понять, что они являются переменными класса.
... = SomeClass.final
И эти два метода не могут работать вместе, поскольку они работают с разными пространствами данных (данными экземпляра и данными класса)
Позвольте мне попытаться объяснить. Рассмотрим этот класс (псевдокод):
Теперь у меня есть следующий вариант использования:
Testitem1=newTest(); item1.somedata = "200";
Testitem2=newTest();
Test.TTT = "1";
Каковы значения?
Хорошо
in item1TTT=1andsomedata=200 in item2TTT=1andsomedata=99
Другими словами, TTT это элемент данных, который является общим для всех экземпляров типа. Поэтому нет смысла говорить
classTest { stringsomedata="99"; string getText() { return somedata; } staticstringTTT= getText(); // error there is is no somedata at this point }
Итак, вопрос в том, почему TTT является статическим или почему getText() не является статическим?
Удалите static и эта ошибка должна быть устранена - но без понимания того, что делает ваш тип, это всего лишь пластырь до следующей ошибки. Каковы требования getText(), которые требуют, чтобы он был нестатическим?
Ответ 2
Уже есть несколько хороших ответов с объяснениями, почему сочетание нестатического Context метода getText() не может быть использовано с вашим static final String.
Хороший вопрос, который следует задать: зачем вы хотите это сделать? Вы пытаетесь загрузить String из своего strings ресурса и заполнить его значение в public static поле. Я предполагаю, что это для того, чтобы некоторые другие ваши классы могли получить к нему доступ? Если да, то в этом нет необходимости. Вместо этого передайте Context в другие ваши классы и вызывайте context.getText(R.string.TTT) изнутри них.
Это позволит вам получить доступ к вашему String ресурсу без необходимости использования public static поля.
Ответ 3
для других, которые находят это в поиске:
Я часто получаю эту ссылку, когда случайно вызываю функцию, используя имя класса, а не имя объекта. Обычно это происходит потому, что я даю им слишком похожие имена : P
ie:
MyClassmyclass=newMyClass();
// then later
MyClass.someFunction();
Очевидно, что это статический метод. (хорош для чего-то) Но то, что я действительно хотел сделать (в большинстве случаев было)
myclass.someFunction();
Это такая глупая ошибка, но каждые пару месяцев я трачу около 30 минут, возясь с переменными в определениях "MyClass", чтобы понять, что я делаю не так, когда на самом деле это просто опечатка.
Забавное примечание: stack overflow выделяет синтаксис, чтобы ошибка здесь была действительно очевидной.
Ответ 4
Вы можете либо сделать свою переменную нестатической