Generics in static methods

2019-03-02 20:21发布

问题:

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?

回答1:

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.



回答2:

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