自定义对象列表作为通用方法的参数

时间:2018-10-11 14:18:03

标签: java generics generic-programming

我在Java中使用通用方法,我想使用自定义对象列表作为参数。

我的主要班级是:

public class Main {

    public static <T> T executeGetRequest(String target, Class<T> resultClass) {

        //MY STUFF
        T result = resultClass.newInstance();
        return result;
    }

    public static void main(String[] args) {
        executeGetRequest("myList", List<myCustomObject>.class); // ERROR HERE
    }
}

我想使用List<myCustomeObject>作为参数。当我使用List.class时,没有错误,但是我不确定结果是否会投射到myCustomObject中。

3 个答案:

答案 0 :(得分:2)

代码很破损...

  1. List<myCustomObject>.class是错误的,只能是List.class

  2. List是一个接口,对List.class.newInstance();的调用仍然会引发异常

  3. 即使您将执行以下代码:

    List<myCustomClass> myList = new ArrayList(); Object myResult = executeGetRequest("myList", myList.getClass());

您将返回myResult作为ArrayList类的实例...

您需要重新考虑要达到的目标-取回myCustomClass对象的列表或myCustomClass的新实例

BTW:在运行时存在“类型擦除”,并且无法从List实现中获取List中的对象类型。

简而言之,在运行时始终为List<Object>

答案 1 :(得分:1)

如果您始终返回项目列表,请使用List<T>作为返回类型:

public class Main {

    public static <T> List<T> executeGetRequest(String target, Class<T> resultClass) throws IllegalAccessException, InstantiationException {

        T item = resultClass.newInstance();
        List<T> result = new ArrayList<>();
        result.add(item);

        return result;
    }

    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        executeGetRequest("myList", Foo.class);
    }

    static class Foo {

    }

答案 2 :(得分:0)

请勿将Class<T>参数与反射(即Class.newInstance())一起使用。请改用Supplier<T>

public static <T> T executeGetRequest(String target, Supplier<T> factory) {

    // MY STUFF

    T result = factory.get();
    return result;
}

然后,按如下所示调用它:

List<myCustomObject> result = executeGetRequest("myList", () -> new ArrayList<>());

创建<>时,甚至可以使用菱形运算符(ArrayList),因为这是由编译器(即List<myCustomObject>)从左侧推断出来的。

您还可以使用方法参考:

List<myCustomObject> result = executeGetRequest("myList", ArrayList::new);