Javaで複数の異なる型の値を一つの関数の戻り値として返したいです。どうすればいいでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
えっと、やりたいことは、下の1.と2.のどちらでしょうか。
- 一度の呼び出しで、「intとStringとboolean」というように複数の値をいっぺんに返す
- あるときはintを返して、別なときはStringを返す
前者の場合は、返り値をくくるための専用のクラスを作るのがいいでしょう。単なる「入れ物」なので、public
なフィールドを持たせるだけでも構いませんし、本格的にハンドリングするならメソッドをつけた普通のクラスにしても大丈夫です。
後者の場合は、返り値をObject
とすれば、何でも入れられます。int
などのプリミティブ型も、ラッパークラスを介することでObject
に入れられます。
投稿2015/11/12 02:43
総合スコア146506
0
メソッドの戻り値の型をObjectで定義すれば実現可能かと思われます。
ただし、呼び出し元で戻り値を適切にcastして利用する必要があります。
型の制限が出来ないので、設計としてはあまりオススメ出来ないです。
上記の他、戻り値として戻したい複数の型に共通のスーパークラスを設計として取り入れられるのであれば、戻り値をそのスーパークラスとすることで、objectよりも安全な設計にできるかと思います。
ただ、もっと良い解決方法があるかもしれないのです(オーバーロードとか)。
記載できる範囲で、具体的にどのような事を実現しようとして複数の型を返却する必要があるのか、教えていただけますか?
投稿2015/11/12 02:52
総合スコア2335
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
次のように質問を捉えて、考えてみました。
課題: 2つの int a と b から a + b , a * b するメソッドをつくる。
対処案 1
値を保持するクラスを定義する。
メソッドから、そのクラスのインスタンスを返すようにする。
対処案 2
配列を返す。
対処案 3
呼び出しパラメータに配列を渡す。
その配列の中身に計算結果を設定する。
java
1class Vals { 2 private int v1; 3 private int v2; 4 5 Vals(int v1, int v2) { 6 this.v1 = v1; 7 this.v2 = v2; 8 } 9 10 public int getV1() { 11 return this.v1; 12 } 13 14 public int getV2() { 15 return this.v2; 16 } 17} 18 19public class MultiVal { 20 // 値を保持するためのクラスをつくって、それを利用する。 21 public static Vals calcX(int a, int b) { 22 Vals ans = new Vals(a + b, a * b); 23 return ans; 24 } 25 26 // 配列を返す。 27 public static int[] calcY(int a, int b) { 28 int[] ans = { a + b, a * b }; 29 return ans; 30 } 31 32 // 配列を渡して、output 用のパラメータとして、それを利用する。 33 public static void calcZ(int a, int b, int[] vals) { 34 vals[0] = a + b; 35 vals[1] = a * b; 36 } 37 38 public static void main(String[] args) { 39 Vals vals = calcX(10, 20); 40 System.out.println("v1 = " + vals.getV1() + ", v2 = " + vals.getV2()); 41 42 int retArray[] = calcY(10, 20); 43 System.out.println("v1 = " + retArray[0] + ", v2 = " + retArray[1]); 44 45 int paramArray[] = { 0, 0 }; 46 calcZ(10, 20, paramArray); 47 System.out.println("v1 = " + paramArray[0] + ", v2 = " + paramArray[1]); 48 } 49}
実行結果:
v1 = 30, v2 = 200 v1 = 30, v2 = 200 v1 = 30, v2 = 200
参考情報
- 戻り値が複数のメソッドを作る http://freefly3104.hatenablog.com/entry/2015/03/18/143952
- How to return multiple values in java? http://stackoverflow.com/questions/8557716/
投稿2015/11/12 14:54
総合スコア22328
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Tuple タプル を検索してください。
c# では、型引数が可変長なのか、型引数の異なるオーバロードなクラスが認められてるのかちょっと調べてないので分かりませんけど、
new Tuple<string, int, double, float, Dictionary>("12345", 1, 2.14D, 3.56F, new Dictionary());
とか初期化できて、a.Item1 とかアクセスで来るみたいです。
残念ですが、java には可変型引数の仕組みが無いので、引数2個〜7個の TupleX を作ってやってあげるのがいいとこです。
java
1public class Tuple<Q,W> { 2 public Q item1; 3 public W item2; 4 public Tuple(Q q, W w) { 5 } 6} 7
マップや object で暗黙的なものにキャストして使うよりかは少しだけ易しい書き方になりますが、そもそも タプルという言葉が普及してないので、コード中にイキナリ出てきたら戸惑うこと間違いないですよね。
投稿2015/11/12 06:46
総合スコア1693
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
同じような回答になってしまいますが・・・
- 型の異なる複数の値を一度に返したい場合
publicクラスを、ちょうどCの構造体のように「入れ物」として使用すれば実現出来ます。
[JavaでC言語の構造体と同じようなことをする](http://homepage3.nifty.com/teranet/jac/JavaAndC.html)
- 場合によっては戻り値の型を変えたい場合
総称型を使用すれば実現出来ます。
[Javaのジェネリック(総称型)の使い方まとめ](http://www.xmisao.com/2013/12/08/java-generics-summary.html) [Java総称型のワイルドカードを上手に使いこなすための勘所](http://d.hatena.ne.jp/ryoasai/touch/20110325/1301078699)
投稿2015/11/12 03:20
総合スコア5936
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。