- 締切済み
Java 戻りの型が2つあるメソッド
@SuppressWarnings("unchecked") public static <E> E get(List<E> list, int offset) { E array = (E) list.toArray(); return array[offset]; } なんでpublic static E get(List<E> list, int offset)じゃだめなんですか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- amanojaku1
- ベストアンサー率54% (265/488)
public static class testClass { public static <E> E get1(List<E> list){ E a = null; return a; } public static <E> List<E> get2(List<E> list){ return list; } public static <E> E get3(E e){ return e; } } > public static <E> E get1(List<E> list){ > public static <E> List<E> get2(List<E> list){ 「testClass」から見れば「get1、get2」の中の「List<E>」も「仮型パラメータ」になります。 > public static <E> E get3(E e){ 「get3」の中の「E」も「仮型パラメータ」になります(上記の「List<E>」と同様の「仮型パラメータ」であると言う事に注意して下さい)。
- amanojaku1
- ベストアンサー率54% (265/488)
>> public static <E> List<E> get2(List<E> list){ > この「<E> List<E>」は「testClass」から見ればクラス内部の定義です、正式名称は、「<E>」は「型変数の宣言」、(「testClass」から見れば)ここの「List<E>」は「仮型パラメータ」になります(上記の「E」と同様の「仮型パラメータ」であると言う事に注意して下さい)。 下記の「型変数へのバインド」の「<String>」の定義が上記の「型変数の宣言」の「<E>」に対応し、上記の「仮型パラメータ」を具現化させます。 > list = testClass.<String>get2(list); > > クラス外部の定義です、正式名称は、「testClass.<String>get2(list)」は「型変数へのバインド」になります。
- amanojaku1
- ベストアンサー率54% (265/488)
まず、この場合 ざっくりと大まかに分けると定義には2種類あります。 クラス内部の定義と、クラス外部の定義です。 この説明を実行するのに必要な「import」は下記のとおりです。 import java.util.List; import java.util.ArrayList; 下記はクラス外部の定義です。 List<String> list = new ArrayList<String>(); 正式名称は、「List<String> list」は「変数の型の宣言」、「ArrayList<String>()」は「型変数へのバインド」と言うらしいです。 下記はクラス内部の定義と、クラス外部の定義、があります。 public static class testClass { public static <E> E get1(List<E> list){ E a = null; return a; } public static <E> List<E> get2(List<E> list){ return list; } } > public static <E> E get1(List<E> list) この「<E> E」は「testClass」から見ればクラス内部の定義です、正式名称は、「<E>」は「型変数の宣言」、「E」は「仮型パラメータ」と言うらしいです。 「List<E>」は「List」から見れば、クラス外部の定義です、「List<E>」は「型変数へのバインド」になります。 > public static <E> List<E> get2(List<E> list){ この「<E> List<E>」は「testClass」から見ればクラス内部の定義です、正式名称は、「<E>」は「型変数の宣言」、(「testClass」から見れば)ここの「List<E>」は「仮型パラメータ」になります(上記の「E」と同様の「仮型パラメータ」であると言う事に注意して下さい)。 「List<E>」は「List」から見れば、クラス外部の定義です、「List<E>」は「型変数へのバインド」になります。 「get2」の実行例を書きに示します。 List<String> list = new ArrayList<String>(); list = testClass.<String>get2(list); > List<String> list = new ArrayList<String>(); クラス外部の定義です、正式名称は、「List<String> list」は「変数の型の宣言」、「ArrayList<String>()」は「型変数へのバインド」になります。 list = testClass.<String>get2(list); クラス外部の定義です、正式名称は、「testClass.<String>get2(list)」は「型変数へのバインド」になります。 《参考》 Javaジェネリクス再入門 http://d.hatena.ne.jp/Nagise/20101105/1288938415 Java ジェネリクスのポイント http://qiita.com/pebblip/items/1206f866980f2ff91e77
- HNEX
- ベストアンサー率62% (43/69)
まず戻りの型が2つあるわけではないです。 このメソッドの戻りの型はEになる訳ですが、 >なんでpublic static E get(List<E> list, int offset)じゃだめなんですか? この宣言ではEとはなんぞやという事になるわけですね。 このメソッドでは「総称型のEを使うよ」という宣言として >public static <E> E get(List<E> list, int offset) となっています