• ベストアンサー

java5.0で Writer.append互換性エラー

タイトルどおりなのですが、 JDK1.4までなら問題なかった部分で「互換性エラー」が出ております。 どのようにソースを修正すべきかご教示ください。 ---------.---------.---------.---------.---------.--------- public abstract class UserAbstractPrintWriter extends PrintWriter { public final static String INDENT_STRING = " "; // TAB1個 public UserAbstractPrintWriter(Writer out) { super(out); } public abstract void printLineStart(int indent, String x); public abstract void printLine(int indent, String x); public abstract void printLineEnd(int indent, String x); } ---------.---------.---------.---------.---------.--------- このクラスのコンパイルエラーとして 戻りの型は Writer.append(char), PrintWriter.append(char) と互換性がありません。 戻りの型は Writer.append(CharSequence), PrintWriter.append(CharSequence) と互換性がありません。 戻りの型は Writer.append(CharSequence, int, int), PrintWriter.append(CharSequence, int, int) と互換性がありません。 の3つが表示されます。 一応ネットでサーチしてみたのですが、根本解決ではなく、コンパイルオプションの変更で対応するものだったので、 「JDK5.0からは本来はどのように記述してほしいのか?」 について、ご教示願えればと思います。 よろしくお願いします。

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

  • ベストアンサー
回答No.1

Java1.4から5.0になった際にオーバーライドしたメソッドの戻り値の型を継承関係ならば同じ型でなくてもOKとなりました。 1.4までは、オーバライドしたメソッドの戻り値の型は同じでなくてはいけませんでした。 つまり、下記のような感じです。 Class SuperA { public SuperA getInstance(){} } Class SubB extends SuperA { public SuperA getInstance() } Class SubC extends SuperA { public SubC getInstance() } と3つクラスがあるとします。 1.4の仕様の場合、SubBクラスはOKですが、SubCはNGとなります。 しかし、5.0の仕様の場合は、SubB、SubC両方ともOKとなります。 そして、今回問題となったPrintWritetとWriterクラスはこの5.0の機能を盛り込んでいるんですね。 5.0からappendメソッドというのが追加になり、Writerクラスではapeendメソッドの戻り値はWriterで定義されていて、PrintWriterクラスではappendメソッドの戻り値はPrintWriterとなっているわけです。(ご存知とは思いますがPrintWriterはWriterの継承クラスです。) >一応ネットでサーチしてみたのですが、根本解決ではなく、コンパイルオプションの変更で対応するものだったので、 >「JDK5.0からは本来はどのように記述してほしいのか?」 上記の理由の為、コンパイルオプションを変更するのが根本的な解決策であったりするわけです。。。(^ー^;) コンパイルオプションを変更するのがどうしても駄目というのでしたら、UserAbstractPrintWriterをPrintWriterの継承とするのでは無く、追加したい機能のツールクラスと変更するのが宜しいかと思います。 UserAbstractPrintWriterで追加されているメソッドの引数にWriterまたは、PrintWriterを追加し、そのメソッドを持つクラスをPrintWriterクラスを継承せずに作成するというのが1つの案かとは思います。

PED02744
質問者

お礼

とてもよくわかりました。 実は、すでに10月の人事異動で数日前までネットアクセスできる状態でもなかったので、返答が遅れました。 (OKwaveから2週間たったけどクローズされてないというメールが着てなかったら質問していたことも忘れてる所でした(^-^;) この質問の回答がほしい部門ではなくなっているので、どうするのかは、引継ぎ先に考えてもらうことにします(^-^; ありがとうございました。

その他の回答 (1)

  • kacchann
  • ベストアンサー率58% (347/594)
回答No.2

jdk1.5.0のjavacを直接つかって、コンパイルしてみましたが、 エラーなくコンパイルできましたよ。 --- ↓こんな情報もあるようですが・・・。 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4991669

PED02744
質問者

お礼

ANO.1さんの回答が今回の私の求める回答であったようです。 継承が絡んでいるということを示しておらず、質問として不十分でしたね。 コンパイル確認までいただきましてありがとうございました。

関連するQ&A

専門家に質問してみよう