I need to add a method in a utility class with some static methods that parses things from a JSON string and returns an array of things.
Problem is that there are various subtypes of these things, so I created this method:
public static <E extends Thing> E[] parseThingsFromJSON(String body) {
return parser.fromJson(body, E[].class);
}
How does the caller tell this method what E
is? Or is there a better way to do this?
You need to pass it.
public static <E extends Thing> E[] parseThingsFromJSON(String body, Class<E[]> eClass) {
return parser.fromJson(body, eClass);
}
Generics is largely a compile time feature. This means its not available at runtime (with some exceptions)
In this case, to make to make the generic type available at runtime, you have to pass it as an additional argument.
From memory this is a similar problem to what you have when using Arrays.asList()
With this you do
Arrays.<MyOjbect>(new MyObject(), new MyObject());
or in your specific case where you are passing an array
eg
Arrays.<Integer[]>asList(new Integer[]{new Integer(1)});
The signature in the JDK for this method is
public static <T> List<T> asList(T... a){...}
which is similar to your I think