解決できないジェネリックと配列型の問題に遭遇しました。これに尽きます。次のコードでは、ファクトリ メソッド ("T convert(String value)") を使用して入力ジェネリック リストの個々の要素を変換しながら、ジェネリック リストを同じジェネリック型の配列に変換する方法を教えてください。
@Test
public void test(){
List<String> integers = Arrays.asList("1", "2", "3", "4");
Integer[] integerArray = new TypeConverter<Integer[]>(Integer[].class).convert(integers);
assertEquals(4, integerArray.length);
assertEquals(1, integerArray[0].intValue());
assertEquals(2, integerArray[1].intValue());
assertEquals(3, integerArray[2].intValue());
assertEquals(4, integerArray[3].intValue());
}
public class TypeConverter<T>{
Class<T> type;
public TypeConverter(Class<T> type) {
this.type = type;
}
T convert(List<String> values){
List output = new ArrayList();
for (String value : values) {
//have to use Object.class here since I cant get the non-array type of T:
output.add(new TypeConverter(type.getComponentType()).convert(value));
}
return (T) output.toArray();
}
T convert(String value){
//convert to an int;
if(type == Integer.class){
return (T) new Integer(Integer.parseInt(value));
}
return null;
}
}
ご覧のとおり、私の素朴なアプローチは、単純に toArray メソッドを使用し、結果を次のようにキャストすることでした。
(T) value.toArray()
しかし、これにより ClassCastException が発生します。
java.lang.ClassCastException: [Ljava.lang.Object; [Ljava.lang.Integer にキャストできません
私が見ていないこれを解決する方法はありますか、それとも別のアプローチを取るべきですか?
編集
これが私が修正しようとしている具体的なコードです。具体的には、visitArray() メソッド: