• ベストアンサー

コンパイルエラー(匿名クラス)

下記ソースがコンパイルエラーを起こしてどうしたらよいか分かりません。 下記エラー参照 Main.java:2: 型の開始が不正です。 new String(){ ^ Main.java:6: <identifier> がありません。 };ん。 (下記ソース) class NormalClass{ new String(){ public String ToString(int n){ return n + ""; } }; } class Main{ public static void main(String args[]){ NormalClass test = new NormalClass(); System.out.println(test.ToString(10)); } }

質問者が選んだベストアンサー

  • ベストアンサー
  • sumou111
  • ベストアンサー率56% (50/89)
回答No.5

Stringはfinalクラスですので、サブクラスに継承することはできません。この場合はObjectを使用すべきでしょう。Objectクラスに用意されているtoString()をオーバライドして使用すれば良いと思います。 (ソース) class NormalClass{ Object obj = new Object(){ public String toString(){ return "10"; } }; } class Main{ public static void main(String args[]){ NormalClass test = new NormalClass(); System.out.println(test.obj.toString()); } }

yukikundesuyo
質問者

お礼

ありがとうございます。ノートではStringクラスを継承して書いていたので、きっと教師のミスでしょう。 「この場合はObjectクラスで継承しなければならない!」ということを覚えます。

その他の回答 (4)

  • tachiwa
  • ベストアンサー率34% (25/73)
回答No.4

とにかく下のようにすればご希望通りに作動します。 class NormalClass{ //new String(){ public String ToString(int n){ return n + ""; } } class Main_02{ public static void main(String args[]){ NormalClass test = new NormalClass(); System.out.println(test.ToString(10)); } }

yukikundesuyo
質問者

補足

動作しますが、コレは匿名クラスではないのでは?

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.3

> 上記ソースを実行したところ次のようなコンパイルエラーが出現しました。 失礼、間に合わせ程度のプログラムなので、少しくらいエラーが出ても勘弁していただきたい。 > スーパークラスでの定義より弱いアクセス特権 (public) を割り当てようとしました 適当なプログラムを書いた私にも非はありますが、このくらいのレベルのエラーは、ぜひ自力で解決して欲しい…… Object クラスの toString メソッドは public なのに、toString をオーバーライドしようとしている匿名サブクラスの toString は public ではない。これがエラーの原因です。 メソッドをオーバーライドするとき、メソッドへのアクセス権が元のメソッドより厳しくなる場合エラーになります。

yukikundesuyo
質問者

お礼

分かりやすい解説ありがとうございました。 「スーパークラスより厳しい修飾子を使用しては駄目!」よく分かりました。

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.2

匿名クラスというのはメソッドの中で定義するものです。 クラスの中に直接定義することはできません(し、意味がありません)。 ところで、String クラスは final なクラスなので、匿名であろうがなかろうがサブクラスは作れません。 質問文のプログラムからはいまいちやりたいことがはっきりしませんが、単に匿名クラスを使う練習をしたいと言うことであれば、Object クラスを継承して toString() メソッドをオーバーライドしてみるといいでしょう。 class Main { public static void main(String[] x) { Object object = new Object() { String toString() { return "Example"; } }; System.out.println(object); } }

yukikundesuyo
質問者

補足

上記ソースを実行したところ次のようなコンパイルエラーが出現しました。どうしたらよいでしょうか? Main3.java:4: の toString() は java.lang.Object の toString() をオーバーライドできません。スーパークラスでの定義より弱いアクセス特権 (public) を割り当てようとしました。→String toString() {

  • asfd
  • ベストアンサー率21% (25/117)
回答No.1

> new String(){ これって何のためにいるんでしょ? class NormalClass{  public String ToString(int n){ return n + ""; } } これじゃ駄目なんでしょか?

yukikundesuyo
質問者

補足

> new String(){ String型クラスを継承した新しいクラスを定義しようとしている次第です。 >これじゃ駄目なんでしょか? 一応、匿名クラスを作成しようとしているので駄目です。 コンパイルエラーの原因を教えていただければ幸いです。