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

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

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

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

Q&A

解決済

1回答

1356閲覧

equals メソッドで true が出力されない

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2018/08/02 08:19

前提・実現したいこと

True.java の #equals で、同じものを比べているはずなのに、TestBExp.java で実行すると、true が出力されず、false と出てしまいます。なぜでしょうか。

True.java

java

1public class True extends AbstractBExp implements BExp { 2 3 public boolean equals(Object o) { 4 if (o == null || (o instanceof BExp)) { 5 return false; 6 } 7 8 BExp that = (BExp) o; 9 return this == that; 10 } 11 12}

TestBExp.java

java

1public class TestBExp { 2 3 public static void main(String[] args) { 4 5 True t1 = new True(); 6 7 System.out.println("equals?" + t1.equals(t1)); 8 9 } 10 11}

###コマンドプロント

equals?false

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

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

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

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

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

guest

回答1

0

ベストアンサー

Java

1 if (o == null || (o instanceof BExp)) { 2 return false; 3 } 4

class True は BExp を implements しているので、
t1.equals(t1) で 「(o instanceof BExp)」 が真になります。

投稿2018/08/02 08:25

daisuke7

総合スコア1563

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

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

退会済みユーザー

退会済みユーザー

2018/08/02 09:17 編集

ありがとうございます!ちなみに、以下のような修正で合っているでしょうか?実行してみたら、true を出力できました public boolean equals(Object o) { if (o == null) { return false; } if (o instanceof BExp) { return true; } BExp that = (BExp) o; return this == that; }
daisuke7

2018/08/02 09:23 編集

いや、それではだめです。 equals() に True 型のオブジェクト渡したらすべて true になってしまいます。 if (!(o instanceof BExp)) { return false; } まず BExp 以外を捨てるためにチェックします。 ところで、最後の return this == that; もこれで問題ないのか疑問です。 Object 同士の == が何を比較しているかはご存知ですか?
退会済みユーザー

退会済みユーザー

2018/08/03 05:34

すいません、、単純に同じものかどうかの比較だと思っていました。そうではないということでしょうか?
daisuke7

2018/08/03 05:55

Javaの型には大きく分けてプリミティブ型(値型、boolean, int など)と 参照型(Object, String, MyClass など)があります。 値型の場合、 == は単純に同じ値かどうかを比較するので見た目通りですが、 参照型の == ってのは「同一かどうか(同じインスタンスかどうか)」を比較しています。 Object obj1 = new Object(); Object obj2 = new Object(); Object obj1b = obj1; この場合、 (obj1 == obj1b) はtrueですが、(obj1 == obj2) はfalseです。 ==(同一かどうか)に対して、equals()は「同値かどうか」を調べるものです。 ですから「同じものかどうか」というのが「同一かどうか」あるいは「同値かどうか」 のどちらを意味するかでコードが変わります。 BExpがどんなインタフェースなのかわかっていませんが、 仮に boolean isHoge(); という定義があり、その結果が同じでなければ 同値とは言えない、ということであれば、 return this.isHoge() == that.isHoge(); となります。
退会済みユーザー

退会済みユーザー

2018/08/03 06:28

本当にありがとうございます!詳しい解説で分かりやすいです。ちなみに、 public class True extends AbstractBExp implements BExp { public boolean isTrueConst() { return true; } public String java() { return "true"; } public String python() { return "True"; } public BExp eval() { return this; } public boolean sameResult(BExp that) { if (this == that) { return true; } else { return false; } } public boolean equals(Object o) { if (o == null || !(o instanceof True)) { return false; } BExp that = (BExp) o; return this == that; } public String toString() { return "True"; } } の場合、boolean sameResult(BExp that) の部分を調べれば良いということでしょうか? ※equals の部分は多少の変更を加えました。
daisuke7

2018/08/03 06:32

sameResult()はなにに使うのでしょうか?
退会済みユーザー

退会済みユーザー

2018/08/03 07:49

同じ結果かどうかどうか調べます。以下の場合だと、t1 と t2 を比べています。 public class TestBExp { public static void main(String[] args) { True t1 = new True(); True t2 = new True(); System.out.println("sameResult?" + t1.equals(t2)); }
daisuke7

2018/08/03 07:54

いや、equals()とsameResult()は別のメソッドで、equals()からsameResult()を呼んでいるわけでもないので、その目的を聞いています。
退会済みユーザー

退会済みユーザー

2018/08/03 10:13

すいません、書き間違えていました。正しくはこうです public class TestBExp { public static void main(String[] args) { True t1 = new True(); True t2 = new True(); System.out.println("sameResult?" + t1.sameResult(t2)); }
daisuke7

2018/08/03 10:17

うーん、、 > boolean sameResult(BExp that) の部分を調べれば良いということでしょうか? sameResult()の中身をどう変更しようと、equals()からsameResult()を呼び出していないので equals()の結果はまったく変わらないですよね。 equals()の挙動についての議論であって、equals()に関係ない定義や実装は知らなくても良いことですが…
退会済みユーザー

退会済みユーザー

2018/08/04 04:13

いろいろとありがとうございます 今一度考え直してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問