1. ホーム
  2. java

[解決済み] 非静的メソッドへの静的参照はできない

2022-09-28 07:43:42

質問

Javaで多言語アプリケーションを構築しています。の文字列を挿入するとエラーが発生する。 R.string リソースXMLファイルから文字列値を挿入する際にエラーが発生します。

public static final String TTT =  (String) getText(R.string.TTT);

これがエラーメッセージです。

エラーです。非静的メソッドであるgetText(int)への静的な参照を、型 Context

この原因は何でしょうか、またどのように解決すればよいでしょうか。

どのように解決するのですか?

では getText() は非静的なので、静的メソッドからこれを呼び出すことはできません。

その理由を理解するためには、この2つの違いを理解する必要があります。

インスタンス(非静的)メソッドは、特定の型(クラス)を持つオブジェクトに対して動作します。これらは、このようにnewで作成されます。

SomeClass myObject = new SomeClass();

インスタンスメソッドを呼び出すには、インスタンス上で呼び出します ( myObject ):

myObject.getText(...)

しかし、静的なメソッドやフィールドを呼び出すことができます だけです。 を直接タイプ上で呼び出すことができます。例えばこのように 前の文は正しくありません。 のようなオブジェクト参照で静的フィールドを参照することもできます。 myObject.staticMethod() のように参照することもできますが、これはクラス変数であることを明確にしないため、推奨されません。

... = SomeClass.final

また、両者は異なるデータ空間(インスタンスデータとクラスデータ)を操作するため、一緒に動作させることはできません

説明してみましょう。このクラス(psuedocode)を考えてみましょう。

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() が非静的であることを必要とする要件は何ですか?