質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

4829閲覧

インターフェースのString toString()メソッドについて

gomatan1258

総合スコア67

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/02/03 06:10

javaのインターフェースにおいて、String toString(); の記述がでてきますが、書く意味はあるのでしょうか?

public interface AppendableCharSequence { public char charAt(int index); public int length(); public AppendableCharSequence append(char c); public String toString(); }

このインタフェースをimplementsしたときにtoString()以外のメソッドは実装しなければいけないのは分かるのですが、toString()はインターフェースに書かなくても、実装先ですでに自動で呼ばれているので、書かなくてもいい気がするのですが、書かないと何かまずいことが起こることがあるのでしょうか?よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

プログラム的に存在する意義は確かにほとんどないでしょうが、Javadocを書く際にObjectクラスでの説明を上書きすることができるので、そのインタフェースの目的に沿った説明が書けるようになる、というメリットがあるのではないでしょうか。

以下は誤りです。


このような定義をしない場合、インタフェース型の変数に対してtoString()を書くとコンパイルエラーになります。
インタフェース型に対してこれをしたいなら定義する必要がありますね。


投稿2017/02/03 07:02

編集2017/02/05 10:26
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2017/02/03 07:20

横から失礼します。 > このような定義をしない場合、インタフェース型の変数に対してtoString()を書くとコンパイルエラーになります。 について、もう少し詳しく教えていただけますでしょうか? 以下のコードは問題なくコンパイル・実行できました(※)ので、質問させていただく次第です。 ※ Mac OSX 10.9, JDK1.7 で確認 public class Main {   public static void main(String[] args) {     AppendableCharSequence appendable = new ConcreteAppendableCharSequence();     System.out.println(appendable.toString());   } } interface AppendableCharSequence { } class ConcreteAppendableCharSequence implements AppendableCharSequence { } 実行結果:  ConcreteAppendableCharSequence@5d9d277e
abs123

2017/02/03 09:53

横から失礼します。 気になったので調べてみました。 Java8言語仕様 9.1.3. Superinterfaces and Subinterfaces While every class is an extension of class Object, there is no single interface of which all interfaces are extensions. 9.2. Interface Members ・If an interface has no direct superinterfaces, then the interface implicitly declares a public abstract member method m with signature s, return type r, and throws clause t corresponding to each public instance method m with signature s, return type r, and throws clause t declared in Object, unless an abstract method with the same signature, same return type, and a compatible throws clause is explicitly declared by the interface. 英語が苦手な私が解釈すると、 Interfaceでは、暗黙的にObjectが継承されている、みたいな仕組みはないけど、 Objectクラスのpublicメソッドに対応したものが、暗黙的に宣言されるよ。 みたいなことが書いてありそうです。
swordone

2017/02/03 15:44

私がかつて何かのインタフェース型変数に対してtoString()を書いたときにコンパイルエラーになったので、そうなのかなと思ったのですが、この仕様にそぐわないですね…。
gomatan1258

2017/02/05 07:01

ご丁寧に教えて頂いてありがとうございました。
KiyoshiMotoki

2017/02/05 10:14

swordone様、abs123様 レスありがとうございます。 勉強させていただきました。 swordone様 > かつて何かのインタフェース型変数に対してtoString()を書いたときにコンパイルエラーになった どのようなシチュエーションだったのか、若干 気になりますね。。
swordone

2017/02/05 10:19

今やってみたらコンパイルエラーにならず通りました。 前どうやったかが思い出せないです…その時のコード保存しときゃよかった
guest

0

AppendableCharSequenceを使う側で、toString()を使った処理が行われるので、
toString()に正しい処理を実装しておきなさい。ということを言いたいんだと思います。

簡単に言うと、toString()を呼んだ時に、
「クラス名@ハッシュコード」が返ってくるようなクラスはクソコードということだと思います。

投稿2017/02/03 06:34

abs123

総合スコア1280

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gomatan1258

2017/02/05 07:01

ご丁寧に教えて頂いてありがとうございました。
guest

0

ベストアンサー

「ほぼない」と感じます

意味合いとしてはinterface上にtoString()メソッドを前提としたdefaultメソッドの実装があったりする場合に必要かも知れないと感じるのですが、実際はJavaでinterfaceをimplementsできるのは参照クラスだけであり必ずObjectの派生になるためか、以下のようなコードを書いてもエラーになりません。

java

1interface Foo { 2 default String getSomething() { 3 return toString(); 4 } 5}

ただ、このインターフェースの実装クラスに向けて「toString()をちゃんとオーバーライドしないと意図したとおりの結果にならないんだけど・・・」という意図でtoStringの宣言に対してJavaDocで「このインターフェースを実装するクラスではtoStringをこうしなければならない」と記述するといったことはあるかも知れません。(例が適切か自信ないですが非チェック例外のthrows句を書いたりそれをJavaDocに明記することに近い感じがします)

回答してはみたもののちょっと自信がないので他の方の回答も拝見したいです・・・

投稿2017/02/03 06:32

編集2017/02/03 06:33
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gomatan1258

2017/02/05 06:30

ご回答ありがとうございます。確認なのですがインターフェースでtoString()メソッドが記述してあって、toString()は実装するクラスで書かなくてもコンパイルエラーにならないんですね?
KSwordOfHaste

2017/02/05 06:55 編集

ならないです。この場合は「なってくれない」といったほうがいいんでしょうが・・・ そういう意味合いで非チェック例外のthrows句も近い感じに思ったのです。 int parseInt(String s) throws NumberFormatException なんて書いてあったとしても呼び出し側が cath (NumberFormatException ...) を書くかどうかは自由でありコンパイラーは何も言ってくれませんので。
gomatan1258

2017/02/05 06:51

ご丁寧に教えて頂いてありがとうございました。
KSwordOfHaste

2017/02/05 06:57

swordoneさんのコメントを拝見したので補足:自分はJava8においてエラーにならないというのは確認してみましたが、もっと古いバージョンではエラーになるのかも知れないと思い次のようにしてみました。 interface IA {} public class T { public static void main(String[] args) { IA a = new IA() {}; System.out.println(a.toString()); } } javac -source 1.3 T.java 1.3の時点では動くということなんでしょうかね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問