Skip to content

Commit 5dcf642

Browse files
committed
Make ListConverters more sane
Split ListConverter into an AbstractListConverter and AbstractListToPrimitiveConverter, and made the generic types follow "input, output" order.
1 parent aab379b commit 5dcf642

File tree

3 files changed

+76
-31
lines changed

3 files changed

+76
-31
lines changed

src/main/java/org/scijava/convert/ListConverter.java renamed to src/main/java/org/scijava/convert/AbstractListConverter.java

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,18 @@
3131

3232
package org.scijava.convert;
3333

34-
import java.lang.reflect.Array;
3534
import java.lang.reflect.Type;
36-
import java.util.Collections;
3735
import java.util.List;
3836

39-
import org.scijava.util.ArrayUtils;
4037
import org.scijava.util.GenericUtils;
41-
import org.scijava.util.PrimitiveArray;
4238

4339
/**
4440
* Abstract {@link Converter} for converting from {@link List}s of
4541
* {@link Number}s to corresponding primitive arrays.
4642
*/
4743
@SuppressWarnings("rawtypes")
48-
public abstract class ListConverter<I, N> extends
49-
AbstractConverter<List<N>, I>
44+
public abstract class AbstractListConverter<I, O> extends
45+
AbstractConverter<List<I>, O>
5046
{
5147

5248
@Override
@@ -60,26 +56,12 @@ public boolean canConvert(final Class<?> src, final Class<?> dest) {
6056

6157
@SuppressWarnings("unchecked")
6258
@Override
63-
public Class<List<N>> getInputType() {
59+
public Class<List<I>> getInputType() {
6460
return (Class)List.class;
6561
}
6662

67-
@SuppressWarnings("unchecked")
68-
@Override
69-
public <T> T convert(Object src, Class<T> dest) {
70-
final List<N> list = (List<N>) src;
71-
final Object array =
72-
Array.newInstance(dest.getComponentType(), list.size());
73-
final PrimitiveArray<T, N> destWrapper =
74-
(PrimitiveArray<T, N>) ArrayUtils.toCollection(array);
75-
76-
Collections.copy(destWrapper, list);
77-
78-
return destWrapper.getArray();
79-
}
80-
8163
/**
8264
* @return The generic parameter of {@link List} supported by this converter.
8365
*/
84-
protected abstract Class<N> getListType();
66+
protected abstract Class<I> getListType();
8567
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*
2+
* #%L
3+
* SciJava Common shared library for SciJava software.
4+
* %%
5+
* Copyright (C) 2009 - 2015 Board of Regents of the University of
6+
* Wisconsin-Madison, Broad Institute of MIT and Harvard, and Max Planck
7+
* Institute of Molecular Cell Biology and Genetics.
8+
* %%
9+
* Redistribution and use in source and binary forms, with or without
10+
* modification, are permitted provided that the following conditions are met:
11+
*
12+
* 1. Redistributions of source code must retain the above copyright notice,
13+
* this list of conditions and the following disclaimer.
14+
* 2. Redistributions in binary form must reproduce the above copyright notice,
15+
* this list of conditions and the following disclaimer in the documentation
16+
* and/or other materials provided with the distribution.
17+
*
18+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
22+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28+
* POSSIBILITY OF SUCH DAMAGE.
29+
* #L%
30+
*/
31+
32+
package org.scijava.convert;
33+
34+
import java.lang.reflect.Array;
35+
import java.util.Collections;
36+
import java.util.List;
37+
38+
import org.scijava.util.ArrayUtils;
39+
import org.scijava.util.PrimitiveArray;
40+
41+
/**
42+
* Abstract {@link Converter} for converting from {@link List}s of
43+
* {@link Number}s to corresponding primitive arrays.
44+
*/
45+
public abstract class AbstractListToPrimitiveConverter<I, O> extends
46+
AbstractListConverter<I, O>
47+
{
48+
49+
@SuppressWarnings("unchecked")
50+
@Override
51+
public <T> T convert(Object src, Class<T> dest) {
52+
final List<I> list = (List<I>) src;
53+
final Object array =
54+
Array.newInstance(dest.getComponentType(), list.size());
55+
final PrimitiveArray<T, I> destWrapper =
56+
(PrimitiveArray<T, I>) ArrayUtils.toCollection(array);
57+
58+
Collections.copy(destWrapper, list);
59+
60+
return destWrapper.getArray();
61+
}
62+
63+
}

src/main/java/org/scijava/convert/ArrayConverters.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
/**
4646
* Container class for all desired combinations of
4747
* {@link PrimitiveArrayUnwrapper}, {@link PrimitiveArrayWrapper} and
48-
* {@link ListConverter} implementations.
48+
* {@link AbstractListToPrimitiveConverter} implementations.
4949
*
5050
* @author Mark Hiner
5151
*/
@@ -86,7 +86,7 @@ public Class<IntArray> getInputType() {
8686
}
8787

8888
@Plugin(type = Converter.class)
89-
public static class IntListConverter extends ListConverter<int[], Integer> {
89+
public static class IntListConverter extends AbstractListToPrimitiveConverter<Integer, int[]> {
9090

9191
@Override
9292
public Class<int[]> getOutputType() {
@@ -135,7 +135,7 @@ public Class<ByteArray> getInputType() {
135135
}
136136

137137
@Plugin(type = Converter.class)
138-
public static class ByteListConverter extends ListConverter<byte[], Byte> {
138+
public static class ByteListConverter extends AbstractListToPrimitiveConverter<Byte, byte[]> {
139139

140140
@Override
141141
public Class<byte[]> getOutputType() {
@@ -184,7 +184,7 @@ public Class<BoolArray> getInputType() {
184184
}
185185

186186
@Plugin(type = Converter.class)
187-
public static class BoolListConverter extends ListConverter<boolean[], Boolean> {
187+
public static class BoolListConverter extends AbstractListToPrimitiveConverter<Boolean, boolean[]> {
188188

189189
@Override
190190
public Class<boolean[]> getOutputType() {
@@ -233,7 +233,7 @@ public Class<CharArray> getInputType() {
233233
}
234234

235235
@Plugin(type = Converter.class)
236-
public static class CharListConverter extends ListConverter<char[], Character> {
236+
public static class CharListConverter extends AbstractListToPrimitiveConverter<Character, char[]> {
237237

238238
@Override
239239
public Class<char[]> getOutputType() {
@@ -282,7 +282,7 @@ public Class<ShortArray> getInputType() {
282282
}
283283

284284
@Plugin(type = Converter.class)
285-
public static class ShortListConverter extends ListConverter<short[], Short> {
285+
public static class ShortListConverter extends AbstractListToPrimitiveConverter<Short, short[]> {
286286

287287
@Override
288288
public Class<short[]> getOutputType() {
@@ -331,7 +331,7 @@ public Class<FloatArray> getInputType() {
331331
}
332332

333333
@Plugin(type = Converter.class)
334-
public static class FloatListConverter extends ListConverter<float[], Float> {
334+
public static class FloatListConverter extends AbstractListToPrimitiveConverter<Float, float[]> {
335335

336336
@Override
337337
public Class<float[]> getOutputType() {
@@ -380,7 +380,7 @@ public Class<DoubleArray> getInputType() {
380380
}
381381

382382
@Plugin(type = Converter.class)
383-
public static class DoubleListConverter extends ListConverter<double[], Double> {
383+
public static class DoubleListConverter extends AbstractListToPrimitiveConverter<Double, double[]> {
384384

385385
@Override
386386
public Class<double[]> getOutputType() {
@@ -429,7 +429,7 @@ public Class<LongArray> getInputType() {
429429
}
430430

431431
@Plugin(type = Converter.class)
432-
public static class LongListConverter extends ListConverter<long[], Long> {
432+
public static class LongListConverter extends AbstractListToPrimitiveConverter<Long, long[]> {
433433

434434
@Override
435435
public Class<long[]> getOutputType() {

0 commit comments

Comments
 (0)