2016-09-15 1 views
0

ジェネリックスを使用して以下のメソッドをリファクタリングしたいと思います。配列デシリアライゼーションのためのjacksonのジェネリック

public Double[] reverseDoubles() throws IOException { 
    String sarray = get.array(); 
    Double[] array = mapper.readValue(sarray, Double[].class); 
    return ArrayUtils.reverse(array); 
} 

public Long[] reverseLongs() throws IOException { 
    String sarray = get.array(); 
    Long[] array = mapper.readValue(sarray, Long[].class); 
    return ArrayUtils.reverse(array); 
} 

私は一次のシグネチャを持つにそれらのすべてのメソッドをリファクタリングするために期待している:

public <T> T[] reverse() throws IOException { 
    ... 
} 
+2

それは与えられた署名ではできません。 *タイプ消去*を見てください。 – shmosel

答えて

1

あなたはreverseに要素のタイプを受け入れずに、これを実行することはできません。しかしタイプを渡すと、あなたのために許容されている場合は、実行時に必要な配列クラスを作成するためにArray.newInstanceを使用することができます。

public <T> T[] reverse(Class<T> elementType) throws IOException { 
    String sarray = get.array(); 
    Class<?> arrayType = Array.newInstance(elementType, 0).getClass(); 
    T[] array = (T[]) mapper.readValue(sarray, arrayType); 
    return ArrayUtils.reverse(array); 
} 
+0

私は代わりに配列型を渡し、新しいインスタンスのハックを避けるでしょう。 – shmosel

関連する問題