java 作为泛型方法参数的自定义对象列表

h4cxqtbf  于 2023-01-04  发布在  Java
关注(0)|答案(4)|浏览(168)

我在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

rkkpypqq

rkkpypqq1#

密码很破...

  1. List<myCustomObject>.class错误,只能是List.class
  2. List是一个接口,调用List.class.newInstance();将引发异常
    1.即使您将执行如下代码:
    List<myCustomClass> myList = new ArrayList(); Object myResult = executeGetRequest("myList", myList.getClass());
    您将返回myResult作为ArrayList类的示例...
    您需要重新考虑您尝试实现的目标是什么-取回myCustomClass对象的列表还是myCustomClass的新示例
    顺便说一句:在运行时有一个“类型擦除”,没有办法从List实现中获得List中的对象类型。
    简而言之,在运行时它始终为List<Object>
ijnw1ujt

ijnw1ujt2#

如果总是返回项目列表,则使用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 {

    }
eqqqjvef

eqqqjvef3#

不要使用Class<T>参数沿着reflection(即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);
taor4pac

taor4pac4#

如果使用Spring:

import org.springframework.core.ParameterizedTypeReference;

并使用

executeGetRequest("myList", new ParameterizedTypeReference<List<MyCustomObject>() {
                });

代替

executeGetRequest("myList", List<myCustomObject>.class);

相关问题