import java.util.*; // might be a specialized generic some day public class CustomLists { private CustomLists() { } // should be an abstract constructor... // might be the erased species of BasicCustomList some day protected abstract static class OfReference extends BasicCustomList { protected OfReference(Object[] elements) { super(elements); } protected OfReference(Class elementType, List elements) { super(elementTypeMethods(elementType).listToArray(elements)); } } // might be an erased view of OfReference some day public final static class OfString extends OfReference { @Override public final Class elementType() { return String.class; } public OfString(String... elements) { super(elements); } public OfString(List elements) { super(String.class, elements); } } // might be an erased view of OfReference some day public final static class OfInteger extends OfReference { @Override public final Class elementType() { return Integer.class; } public OfInteger(Integer... elements) { super(elements); } public OfInteger(List elements) { super(Integer.class, elements); } } // might be a species of BasicCustomList some day public final static class OfInt extends BasicCustomList { @Override public final Class elementType() { return int.class; } public OfInt(int... elements) { super(elements); } public OfInt(List elements) { super(elementTypeMethods(int.class).listToArray(elements)); } } // might be a species of BasicCustomList some day public final static class OfDouble extends BasicCustomList { @Override public final Class elementType() { return double.class; } public OfDouble(double... elements) { super(elements); } public OfDouble(List elements) { super(elementTypeMethods(double.class).listToArray(elements)); } } // hand-tweaked list used to evaluate performance of IntList: public final static class FastIntList extends BasicCustomList { @Override public final Class elementType() { return int.class; } @Override public final int size() { return ((int[]) elementArray).length; } @Override public final Integer get(int i) { return ((int[]) elementArray)[i]; } public FastIntList(int... elements) { super(elements); } public FastIntList(List elements) { super(elementTypeMethods(int.class).listToArray(elements)); } } // hand-tweaked list used to evaluate performance of IntegerList: public final static class FastIntegerList extends BasicCustomList { @Override public final Class elementType() { return Integer.class; } @Override public final int size() { return ((Integer[]) elementArray).length; } @Override public final Integer get(int i) { return ((Integer[]) elementArray)[i]; } public FastIntegerList(Integer... elements) { super(elements); } public FastIntegerList(List elements) { super(elementTypeMethods(int.class).listToArray(elements)); } } // hand-tweaked list used to evaluate performance of StringList: public final static class FastStringList extends BasicCustomList { @Override public final Class elementType() { return String.class; } @Override public final int size() { return ((String[]) elementArray).length; } @Override public final String get(int i) { return ((String[]) elementArray)[i]; } public FastStringList(String... elements) { super(elements); } public FastStringList(List elements) { super(elementTypeMethods(int.class).listToArray(elements)); } } }