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

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

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

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

Q&A

5回答

54477閲覧

Java 複数の型をreturnする方法

stareaug

総合スコア8

Java

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

1グッド

0クリップ

投稿2015/11/12 02:38

Javaで複数の異なる型の値を一つの関数の戻り値として返したいです。どうすればいいでしょうか?

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答5

0

えっと、やりたいことは、下の1.と2.のどちらでしょうか。

  1. 一度の呼び出しで、「intとStringとboolean」というように複数の値をいっぺんに返す
  2. あるときはintを返して、別なときはStringを返す

前者の場合は、返り値をくくるための専用のクラスを作るのがいいでしょう。単なる「入れ物」なので、publicなフィールドを持たせるだけでも構いませんし、本格的にハンドリングするならメソッドをつけた普通のクラスにしても大丈夫です。

後者の場合は、返り値をObjectとすれば、何でも入れられます。intなどのプリミティブ型も、ラッパークラスを介することでObjectに入れられます。

投稿2015/11/12 02:43

maisumakun

総合スコア145062

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

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

0

メソッドの戻り値の型をObjectで定義すれば実現可能かと思われます。
ただし、呼び出し元で戻り値を適切にcastして利用する必要があります。
型の制限が出来ないので、設計としてはあまりオススメ出来ないです。

上記の他、戻り値として戻したい複数の型に共通のスーパークラスを設計として取り入れられるのであれば、戻り値をそのスーパークラスとすることで、objectよりも安全な設計にできるかと思います。

ただ、もっと良い解決方法があるかもしれないのです(オーバーロードとか)。
記載できる範囲で、具体的にどのような事を実現しようとして複数の型を返却する必要があるのか、教えていただけますか?

投稿2015/11/12 02:52

takyafumin

総合スコア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

参考情報

投稿2015/11/12 14:54

katoy

総合スコア22322

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

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

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

ipadcaron

総合スコア1693

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

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

0

同じような回答になってしまいますが・・・

  1. 型の異なる複数の値を一度に返したい場合

publicクラスを、ちょうどCの構造体のように「入れ物」として使用すれば実現出来ます。

[JavaでC言語の構造体と同じようなことをする](http://homepage3.nifty.com/teranet/jac/JavaAndC.html)
  1. 場合によっては戻り値の型を変えたい場合

総称型を使用すれば実現出来ます。

[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

pi-chan

総合スコア5936

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問