为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

达令说 2021-11-11 18:03:31
我在 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    }}我想用作参数 a List<myCustomeObject>。当我使用 时List.class,没有错误,但我不确定结果是否会被转换为myCustomObject.
查看完整描述

3 回答

?
慕婉清6462132

TA贡献1804条经验 获得超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

顺便说一句:在运行时有一个“类型擦除”,并且无法获取ListfromList实现中的对象类型。

总之在运行时它总是 List<Object>


查看完整回答
反对 回复 2021-11-11
?
HUX布斯

TA贡献1876条经验 获得超6个赞

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


    }


查看完整回答
反对 回复 2021-11-11
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

不要使用Class<T>参数和反射(即Class.newInstance())。使用 aSupplier<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);


查看完整回答
反对 回复 2021-11-11
  • 3 回答
  • 0 关注
  • 203 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信