2016-11-19 8 views
2

私はどのように単一のメソッドがJavaのオブジェクトのさまざまな型を返すことができるか質問したいと思いますか?Javaのメソッドからさまざまな種類のオブジェクトを返す方法は?

私たちはクラス "a"を持っていると言うことができます。クラスaは、クラス「b」および「c」の親クラスである。

java.util.ArrayList<a> list; 

ので、このリストは、クラスA、クラスBおよびクラスCのオブジェクトを含めることができます。 は、私たちのように定義配列リストを持って言うことができます。 クラスbの1つのオブジェクトとクラスcの1つのオブジェクトを作成し、それらをリストに追加するとします。

は今、私はこのようなメソッドを作成したい:

public ? get_element(boolean first) 
{ 
    if (first) 
    { 
     return list.get(0); 
    } 
    else 
    { 
     return list.get(1); 
    } 
} 

私の問題は、私の代わりに置くかわからないということであり、「?」この方法では。 要素が返されたときに "a"を置くと "public a get_element"となり、要素が元々 "b"または "c"であったとしても常に型 "a"になります。

しかし、返された要素が、追加された要素の型であることが必要です。 リストのインデックス0にタイプ "b"の要素を追加し、インデックス1にタイプ "c"の要素を追加すると、get_elementメソッドを呼び出すときに、 "false"に等しいパラメータを指定すると、返される要素の型は "c"で、呼び出すときにtrueを返すと返される要素の型はbです。

もちろん、返された要素を私が望むタイプにキャストできます。しかし、これは私が書いた単なる例ですが、私は本当のためにはるかに複雑な状況があります。私はすべての1つのクラスを拡張する約10のクラスがあり、それらの11種類のオブジェクトのいずれかを含むことができる配列のリストは、何らかの形で配置することができますので、私はどのタイプのどの位置にあるか分からないすべての型にキャストしようとするコードが見つかるまでそれを1つずつキャストしようとするコードを作成します。

しかし、知りたいのですが、もっと簡単な方法がありますか?

public class test 
{ 
    public static class a{} 
    public static class b extends a{} 
    public static class c extends a{} 
    public static java.util.ArrayList<a> list = new java.util.ArrayList<a>(2); 
    static 
    { 
     b first_object = new b(); 
     c second_object = new c(); 
     list.add(first_object); 
     list.add(second_object); 
     b first_returned_object = get_element(true); 
     c second_returned_object = get_element(false); 
    } 
    public static ? get_element(boolean first) 
    { 
     if (first) 
     { 
      return list.get(0); 
     } 
     else 
     { 
      return list.get(1); 
     } 
    } 
} 

私の問題は私が得る要素法における「get_element」の前に置くのか分からないということです。私の質問を簡素化する

は、私はこの.javaファイルを書きました。

"first_returned_object"にタイプbのオブジェクトを保存し、 "second_returned_object"にタイプcのオブジェクトを保存するにはどうすればよいですか?

もちろん、これは単なる例ですが、私はこれらのクラスを使いませんが、これは役に立たないので、私はできるだけシンプルに質問しました。

この種の問題を抱えている私の実際のクラスは、5000以上の行を持っていますので、ここにはそれらを含めることができませんでしたので、私の問題を示す最も簡単なバージョンを書きました。

提案がありますか?

thanx。

投稿scriptum: to caps lock haters:あなたの憎悪はここに双方向です。 ;)

+1

*インターフェイスに '公共get_element(ブール最初の)' *プログラム。 –

+0

多型リターン(および多相コレクション)は、明示的なキャストなしでJavaではサポートされていません。あなたの配列リストが 'A'型を含むと宣言されている場合、それは' A'のサブタイプである要素を含むことができますが、実際の型を返すメソッドを書くことはできません。 'A' 'B'または' C'のみに出現するメソッドやパブリックメンバを使用する必要がある場合は、 'B'または' C'を使用します。 –

+0

将来の質問があれば、このサイトは専門家向けです。必要に応じてシフトキーを使用してください。 – 4castle

答えて

0

Genericsを使用して、戻り値の型を動的にすることができます。

は、この方法を試してください。

public static <Type> Type get_element(int index) 
{ 
    String s = list.get(index).getClass().toString(); // returns "class class_name" 
    String[] split = s.split(" "); 
    Class<?> theClass = Class.forName(split[1]); // You need "class_name" 

    return (Type) theClass.cast(list.get(index)); 
} 

または単に:

public static <Type> Type get_element(int index) 
{ 
    return (Type) list.get(index); 
} 
+0

干し草Skreweverything、 あなたの返信ありがとうございます。 実際には、私は約1年間Javaでプログラミングしていますが、私は新しいジェネリックを使用しました。私は実際にそれらが何であるか知りませんが、私はすぐにjavaのドキュメントでそれを調べます。とにかくあなたの投稿について、まあ、ありがとう、たくさん。これは本当にうまくいきます! get_elementメソッドを自分のものに置き換えた場合、返されたオブジェクトをもうキャストする必要はありません。 ありがとう、私はあなたの例を参照し、ジェネリックスに関するドキュメント、それを使用する方法を学び、私の実際のコードで実装します。 ありがとうございます。 :) –

関連する問題