回答編集履歴

2

zを追加

2015/03/03 13:16

投稿

argius
argius

スコア9390

test CHANGED
@@ -82,6 +82,8 @@
82
82
 
83
83
  int y = 2;
84
84
 
85
+ String z = "5";
86
+
85
87
 
86
88
 
87
89
  @Override
@@ -152,7 +154,7 @@
152
154
 
153
155
  System.out.println(getMembers(new Foo()));
154
156
 
155
- // => {y=2, x=3}
157
+ // => {z=5, y=2, x=3}
156
158
 
157
159
  }
158
160
 

1

追記

2015/03/03 13:16

投稿

argius
argius

スコア9390

test CHANGED
@@ -43,3 +43,123 @@
43
43
  `field.get(obj)`の戻り値は`Object`になりますが、どのように`V`に変換しますか?
44
44
 
45
45
  `Object`→`V`の変換は、`V`が`String`ならば`toString`でできますが、それ以外の場合はどのように変換するイメージですか?
46
+
47
+
48
+
49
+
50
+
51
+ ---
52
+
53
+
54
+
55
+ (追記)
56
+
57
+
58
+
59
+ コンバーターの機能をBaseクラスに持たせるようにします。コンバーターはサブクラスごとに実装する必要があります。
60
+
61
+
62
+
63
+ ```lang-java
64
+
65
+ abstract class Base<V> {
66
+
67
+
68
+
69
+ abstract V convert(Object o);
70
+
71
+
72
+
73
+ }
74
+
75
+
76
+
77
+ class Foo extends Base<Integer> {
78
+
79
+
80
+
81
+ int x = 3;
82
+
83
+ int y = 2;
84
+
85
+
86
+
87
+ @Override
88
+
89
+ Integer convert(Object o) {
90
+
91
+ if (o instanceof Number) {
92
+
93
+ return ((Number)o).intValue();
94
+
95
+ }
96
+
97
+ if (o instanceof CharSequence) {
98
+
99
+ try {
100
+
101
+ return Integer.parseInt(o.toString());
102
+
103
+ } catch (NumberFormatException e) {
104
+
105
+ e.printStackTrace();
106
+
107
+ }
108
+
109
+ }
110
+
111
+ return 0; // デフォルト値
112
+
113
+ }
114
+
115
+
116
+
117
+ }
118
+
119
+
120
+
121
+ public final class App {
122
+
123
+
124
+
125
+ static <V, T extends Base<V>> Map<String, V> getMembers(T obj) {
126
+
127
+ Map<String, V> map = new HashMap<>();
128
+
129
+ for (Field field : obj.getClass().getDeclaredFields()) {
130
+
131
+ field.setAccessible(true);
132
+
133
+ try {
134
+
135
+ map.put(field.getName(), obj.convert(field.get(obj)));
136
+
137
+ } catch (IllegalArgumentException | IllegalAccessException e) {
138
+
139
+ e.printStackTrace();
140
+
141
+ }
142
+
143
+ }
144
+
145
+ return map;
146
+
147
+ }
148
+
149
+
150
+
151
+ public static void main(String[] args) {
152
+
153
+ System.out.println(getMembers(new Foo()));
154
+
155
+ // => {y=2, x=3}
156
+
157
+ }
158
+
159
+
160
+
161
+ }
162
+
163
+ ```
164
+
165
+