あるメソッドの仮引数を定義する際に、実際に値が引数に代入されないと型がわからない場合、ジェネリクスという方法を使うと仮引数の型を固定せずに実装できるようですが、その正しい表記を教えて下さい。
仮引数の部分を<T>や<T extends Base>や<?>などのように指定してみたのですが、構文エラーになります。
やりたいことは以下のようなイメージで、引数のメンバー変数名とその値をすべて取得することです。
private Map<String, V> getMembers(<T extends Base> obj){ // 引数の型は不定
HushMap <String, V > map = new HushMap<String, V >(); // 値の型は不定
for (Field field : obj.getClass().getDeclaredFields(){
field.setAccessible(true);
map.put(field.getName(), field.get(obj) ) ;
}
return map;
}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
型が揃っていないのであれば,ハッシュマップを使うよりBundleのほうが使い勝手がいいのではないでしょうか?
投稿2015/03/06 15:27
総合スコア20649
0
ベストアンサー
まず、仮型引数を使わない場合から考えてみましょう。
こんな感じになります。
lang
1static Map<String, Object> getMembers(Object obj) { 2 Map<String, Object> map = new HashMap<>(); 3 for (Field field : obj.getClass().getDeclaredFields()) { 4 field.setAccessible(true); 5 try { 6 map.put(field.getName(), field.get(obj)); 7 } catch (IllegalArgumentException | IllegalAccessException e) { 8 e.printStackTrace(); 9 } 10 } 11 return map; 12}
これにT extends Base
やV
を導入すれば良いと思いますが、逆に質問です。
T
のフィールドは全て同じクラスということでしょうか?
field.get(obj)
の戻り値はObject
になりますが、どのようにV
に変換しますか?
Object
→V
の変換は、V
がString
ならばtoString
でできますが、それ以外の場合はどのように変換するイメージですか?
(追記)
コンバーターの機能をBaseクラスに持たせるようにします。コンバーターはサブクラスごとに実装する必要があります。
lang
1abstract class Base<V> { 2 3 abstract V convert(Object o); 4 5} 6 7class Foo extends Base<Integer> { 8 9 int x = 3; 10 int y = 2; 11 String z = "5"; 12 13 @Override 14 Integer convert(Object o) { 15 if (o instanceof Number) { 16 return ((Number)o).intValue(); 17 } 18 if (o instanceof CharSequence) { 19 try { 20 return Integer.parseInt(o.toString()); 21 } catch (NumberFormatException e) { 22 e.printStackTrace(); 23 } 24 } 25 return 0; // デフォルト値 26 } 27 28} 29 30public final class App { 31 32 static <V, T extends Base<V>> Map<String, V> getMembers(T obj) { 33 Map<String, V> map = new HashMap<>(); 34 for (Field field : obj.getClass().getDeclaredFields()) { 35 field.setAccessible(true); 36 try { 37 map.put(field.getName(), obj.convert(field.get(obj))); 38 } catch (IllegalArgumentException | IllegalAccessException e) { 39 e.printStackTrace(); 40 } 41 } 42 return map; 43 } 44 45 public static void main(String[] args) { 46 System.out.println(getMembers(new Foo())); 47 // => {z=5, y=2, x=3} 48 } 49 50}
投稿2015/03/03 01:36
編集2015/03/03 13:16総合スコア9388
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/03/03 06:23
2015/03/03 12:58
2015/03/03 13:21
2015/03/05 23:27
2015/03/05 23:44
2015/03/09 09:27
0
とりあえず、メソッドの宣言と変数の宣言のみですが...
lang
1private <V extends Base> Map<String, V> getMembers(V obj) { 2 Map<String, V> map = new HashMap<>(); 3 return map; 4}
非常に参考になるサイトがありますので、貼っておきます。
投稿2015/03/02 16:03
総合スコア1656
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/03/09 09:20