- ベストアンサー
コンパイルエラー(匿名クラス)
下記ソースがコンパイルエラーを起こしてどうしたらよいか分かりません。 下記エラー参照 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)); } }
- みんなの回答 (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()); } }
その他の回答 (4)
- tachiwa
- ベストアンサー率34% (25/73)
とにかく下のようにすればご希望通りに作動します。 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)); } }
補足
動作しますが、コレは匿名クラスではないのでは?
- UKY
- ベストアンサー率50% (604/1207)
> 上記ソースを実行したところ次のようなコンパイルエラーが出現しました。 失礼、間に合わせ程度のプログラムなので、少しくらいエラーが出ても勘弁していただきたい。 > スーパークラスでの定義より弱いアクセス特権 (public) を割り当てようとしました 適当なプログラムを書いた私にも非はありますが、このくらいのレベルのエラーは、ぜひ自力で解決して欲しい…… Object クラスの toString メソッドは public なのに、toString をオーバーライドしようとしている匿名サブクラスの toString は public ではない。これがエラーの原因です。 メソッドをオーバーライドするとき、メソッドへのアクセス権が元のメソッドより厳しくなる場合エラーになります。
お礼
分かりやすい解説ありがとうございました。 「スーパークラスより厳しい修飾子を使用しては駄目!」よく分かりました。
- UKY
- ベストアンサー率50% (604/1207)
匿名クラスというのはメソッドの中で定義するものです。 クラスの中に直接定義することはできません(し、意味がありません)。 ところで、String クラスは final なクラスなので、匿名であろうがなかろうがサブクラスは作れません。 質問文のプログラムからはいまいちやりたいことがはっきりしませんが、単に匿名クラスを使う練習をしたいと言うことであれば、Object クラスを継承して toString() メソッドをオーバーライドしてみるといいでしょう。 class Main { public static void main(String[] x) { Object object = new Object() { String toString() { return "Example"; } }; System.out.println(object); } }
補足
上記ソースを実行したところ次のようなコンパイルエラーが出現しました。どうしたらよいでしょうか? Main3.java:4: の toString() は java.lang.Object の toString() をオーバーライドできません。スーパークラスでの定義より弱いアクセス特権 (public) を割り当てようとしました。→String toString() {
- asfd
- ベストアンサー率21% (25/117)
> new String(){ これって何のためにいるんでしょ? class NormalClass{ public String ToString(int n){ return n + ""; } } これじゃ駄目なんでしょか?
補足
> new String(){ String型クラスを継承した新しいクラスを定義しようとしている次第です。 >これじゃ駄目なんでしょか? 一応、匿名クラスを作成しようとしているので駄目です。 コンパイルエラーの原因を教えていただければ幸いです。
お礼
ありがとうございます。ノートではStringクラスを継承して書いていたので、きっと教師のミスでしょう。 「この場合はObjectクラスで継承しなければならない!」ということを覚えます。