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

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

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

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

Q&A

7回答

2736閲覧

javaでの複数のreturnについて

qkazooing

総合スコア22

Java

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

1グッド

1クリップ

投稿2019/01/12 11:57

編集2019/01/12 12:18

returnがひとつしかできないのは知っているのですが、例えば複数の値があり条件にあうどちらか一つを選択してreturnするにはどうすればいいでしょうか?
例えば値が整数Aか浮動小数Bかどちらか判別してreturnする場合にはどうすればいいでしょうか?
instanceofでの場合分けはうまくできませんでした。

public class TEST{ public test(-----){ * *計算 *結果が整数ならA、浮動小数ならBの変数へ * return 整数クラス(A); return 浮動小数クラス(B) } }

最後のreturn部分を場合分けしたいです。

DrqYuto👍を押しています

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

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

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

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

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

cateye

2019/01/12 12:04

>複数の値・・・整数と浮動小数は、変数そのものが違うと思うのですが?
ozwk

2019/01/12 12:25

多分何かしら計算して、その結果の少数部が0かそうでないかで場合分けしたいんだと思うんですがどうでしょう
swordone

2019/01/13 10:36

testメソッド内でどんな変数を扱い、どんな計算をしているのか、もう少し具体的に書いて下さい。 今の状態だと曖昧な点が多く十分な回答が出来ません。
guest

回答7

0

returnするのは一つですが、return はいくつでもおけますよ

投稿2019/01/12 11:58

y_waiwai

総合スコア88167

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

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

qkazooing

2019/01/12 12:13

計算を行い最終的に値が整数ならreturnで整数を受け取るクラスへ、浮動小数ならreturnで浮動小数を受け取るクラスへreturnを続けてしたのですが後に書いたreturnは到達不能コードと出てしまいます。
y_waiwai

2019/01/12 12:18

そのコードを提示しましょう なんかまちがってます
y_waiwai

2019/01/12 12:23

残念ながら、return命令はそういうふうに使うもんではありません 「java return 使い方」あたりでぐぐってみましょう
guest

0

returnがひとつしかできないのは知っている

という認識に加えて

(A) メソッドはそれぞれ「特定の型しかreturnできない
(B) メソッドは自分の呼び出し元にしか値をreturnできない
(C) メソッド呼び出し側は戻り値を場合によって違う変数に代入したりはできない

ことをはっきりと把握しておきましょう。

多分質問者さんの課題は「Javaの仕様を前提としてどういう考え方ができるか」をうまくイメージできないことだと思います。(A)~(C)の仕様から質問者さんがおっしゃるようなこと(メソッドの戻り値を型によって自動的に違う変数へ代入すること)はできないのですが、型が階層的になっている(継承関係を持つ型が互換性を持っている)という知識がつくと以下のように「共通の型を用いて異なる方を扱う」アイデアが選択可能な方法の一つとして浮かぶようになってくると思います。

Java

1// 呼び出される側の関数 2// 文字列を整数(Integer)か浮動小数点数(Double)に変換して返す 3// IntegerとDoubleは型が違います。しかしながらどちらもNumberクラスの派生のため 4// メソッドの戻り値をNumberにしておくとIntegerでもDoubleでも返すことができます。 5Number callee(String s) { 6 if (s.contains(".")) { // 小数点が含まれていたら浮動小数点数(実数)と考える 7 return Double.parseDouble(s); 8 } else { // そうでなければ整数と考える 9 return Integer.parseInt(s); 10 } 11} 12 13// 呼び出し側 14public static void main(String[] args) { 15 Scanner scanner = new Scanner(System.in); 16 for (;;) { 17 String line = scanner.readLine(); 18 if (line == null) break; 19 // 関数を呼び出し、戻り値をNumber型の変数で受け取ります。 20 Number number = callee(line); 21 // Number型の変数にはInteger型の値もDouble型の値も代入できるので 22 // 実際にどちらの型の値が格納されているかinstanceofで検査できます。 23 if (number instanceof Integer) { 24 System.out.println("was an Integer " + number); 25 } else { 26 System.out.println("was a Double " + number); 27 } 28 } 29}

上記コードのポイントは

  • 整数をInteger型のインスタンスとして、実数をDouble型のインスタンスとして扱う
  • IntegerはNumber型の派生型、Doubleもそう。
  • それゆえNumber型の変数はInteger型の値もDouble型の値も代入できる。
  • 別々の型の違う変数へ戻り値を代入することを考えなくてもよい

投稿2019/01/12 13:10

KSwordOfHaste

総合スコア18404

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

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

0

値が整数Aか浮動小数Bかどちらか判別してreturnする

これを関数の中で実現する方法はありません。なぜならば、関数を作る際に戻り値の型を先に決めなければならないからです。これを代用するならば、関数の呼び出し側で条件分岐することが必要となります。

もちろん、特殊な型を独自に定義するという方法もありますがこれは労力に見合うとは思えません。

投稿2019/01/13 14:27

HogeAnimalLover

総合スコア4853

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

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

0

Objec指向で Animal, Doc, Cat のような例が示されることがあります。
( Doc と Cat はどちらも Animal のサブクラス)

Number, Integer, Double も同様の関係があります。
そして Integer, Double どちらにもToString() や DoubleValue() があります。

質問文にある test() では、なんらかの条件で分岐して、 Integer, Double を返すようにできます。
このとき test() は Number を返すメソッドとして定義をしてやる必要があります。

以下のプログラムを参考に考えてみてください。

java

1class TEST { 2 public Number calc(int v) { 3 if (v == 0) { 4 return new Integer(2); 5 } else { 6 return new Double(3.14); 7 } 8 } 9} 10 11public class Example2XX { 12 public static void main(String[] args) { 13 TEST t = new TEST(); 14 for(int i = 0; i < 2; i++) { 15 Number n = t.calc(i); 16 System.out.println(n.getClass() + ":\t" + n.toString()); 17 18 if (n instanceof Integer) { 19 int v = n.intValue(); 20 System.out.println(" Integer: " + v); 21 } else if (n instanceof Double) { 22 double v = n.doubleValue(); 23 System.out.println(" Double: " + v); 24 } 25 } 26 } 27}

実行結果はつぎのようになります。

class java.lang.Integer: 2 Integer: 2 class java.lang.Double: 3.14 Double: 3.14

calc() を呼び出した側には Number で返ってきます。
Integer, Double のとちらにもあるメソッドを使って処理をしても良いし、
instaneof でどちらのクラスが返ってきたかを判別して処理をしても良いです。

投稿2019/01/13 08:53

編集2019/01/13 14:35
katoy

総合スコア22328

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

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

0

Java

1 return 整数クラス(A); 2 return 浮動小数クラス(B);

というソース自体が間違えています。
returnは一回しか1回の関数呼び出しでできません。

Java

1public Object method( Object o ) 2{ 3 if( o instanceof Double ){ // double型なら 4 return double; // double型を返す 5 }else if( o instanceof Integer ){ // int型なら 6 return int; 7 }else{ 8 throw new IllegalArgumentException(); 9 } 10}

とすると、とりあえずできると思います。ただ、この場合数以外も入れられてしまうので、
自分で使う専用になるかと。

もしくは、こういうのもあります。

public Object method(){ double d; // 予め計算結果の方を固定 // 計算して結果を d に入れる String keisankekka = String.valueOf( d ); // 文字列変換 String[] args = keisankekka.split( "\." ); // .(小数点で区切る) 正規表現違ったらごめんなさい if( args.length == 1 ){ // 小数点がなかったら(整数なら) int data = Integer.parceInt( args[ 0 ] ); // Stringをintに return (Object)data; }else if( args.length == 2 ){ // 小数点があったら String d = args[ 0 ] + args[ 1 ]; double data = Double.parceDouble( d ); // Stringをdoubleに return (Object)data; }

こっちでは、戻り値が不安定ですが、引数を数で固定できます。

オーバーロードを使う手もありますね。

public int add( int a, int b ) { return a + b; } public double add( String a, String b ) // 型が区別できるように違わないといけないのでStringで(doubleは整数も入る) { // 文字列からdoubleに変換(上参照)し、計算して返す } public double subone( double s ) { return s - 1; }

ただし、引数の型と数が違わなければいけません。

結局、戻す型が関数内で変わる(いくつかの種類が想定される)
というのは自分が使う場合はいいですが他の人が使う場合に不便になります。
その点に注意をして関数を作ることを考えないといけません。

投稿2019/01/13 00:22

編集2019/01/13 00:23
yukkuri

総合スコア624

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

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

0

浮動小数点で計算して、結果が整数か否かを判断したいということならば、おそらくこう?

java

1double d; 2// 計算 3if(d == Math.rint(d)) { 4 return 整数クラス((int)d); 5} else { 6 return 浮動小数クラス(d); 7}

ただし、浮動小数の計算は誤差を生みやすく、整数になるべき計算でもifがtrueにならない可能性があります。

投稿2019/01/12 13:38

swordone

総合スコア20675

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

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

0

戻り値の型を条件によって変えたい。という理解でよろしいでしょうか?
一度、イメージでも構わないのでコードを見たいです。

投稿2019/01/12 12:19

Kaiser

総合スコア295

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問