returnがひとつしかできないのは知っているのですが、例えば複数の値があり条件にあうどちらか一つを選択してreturnするにはどうすればいいでしょうか?
例えば値が整数Aか浮動小数Bかどちらか判別してreturnする場合にはどうすればいいでしょうか?
instanceofでの場合分けはうまくできませんでした。
public class TEST{ public test(-----){ * *計算 *結果が整数ならA、浮動小数ならBの変数へ * return 整数クラス(A); return 浮動小数クラス(B) } }
最後のreturn部分を場合分けしたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
returnするのは一つですが、return はいくつでもおけますよ
投稿2019/01/12 11:58
総合スコア88167
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
総合スコア18404
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
値が整数Aか浮動小数Bかどちらか判別してreturnする
これを関数の中で実現する方法はありません。なぜならば、関数を作る際に戻り値の型を先に決めなければならないからです。これを代用するならば、関数の呼び出し側で条件分岐することが必要となります。
もちろん、特殊な型を独自に定義するという方法もありますがこれは労力に見合うとは思えません。
投稿2019/01/13 14:27
総合スコア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総合スコア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総合スコア624
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。