Java 泛型-获取引用类型

Java 泛型-获取引用类型,java,generics,reflection,arraylist,Java,Generics,Reflection,Arraylist,我无法获取列表的类型。问题是在声明时我没有指定类型。我只在运行时设置它 我有一节POJO课 public class MyObject<T> { private String name; private List<T> list; //getter and setter } 如果在运行时设置,如何获取类型?该方法具有返回类型,其中可以是Class或parameteredType。对我来说,如果在没有参数化类型的字段上调用,它就不会返回参数化类型。在这

我无法获取列表的类型。问题是在声明时我没有指定类型。我只在运行时设置它

我有一节POJO课

public class MyObject<T> {

    private String name;
    private List<T> list;

//getter and setter
}
如果在运行时设置,如何获取类型?

该方法具有返回类型,其中可以是
Class
parameteredType
。对我来说,如果在没有参数化类型的字段上调用,它就不会返回
参数化类型
。在这种情况下,它似乎返回
Class
。在这一点上,这个问题没有定论

至于您关于如何在运行时获取实际类型的问题:泛型类型信息在运行时被擦除。它仅用于确保编译时的类型安全。将实际类型为
ArrayList
的对象分配给静态类型为
List
的变量时,在运行时无法获取实际对象的泛型类型。您可以做的是检查列表中包含的对象的类型:

Class<?> foo = list.get(0).getClass();
Class foo=list.get(0.getClass();
该方法具有返回类型,其中可以是
参数化类型
。对我来说,如果在没有参数化类型的字段上调用,它就不会返回
参数化类型
。在这种情况下,它似乎返回
Class
。在这一点上,这个问题没有定论

至于您关于如何在运行时获取实际类型的问题:泛型类型信息在运行时被擦除。它仅用于确保编译时的类型安全。将实际类型为
ArrayList
的对象分配给静态类型为
List
的变量时,在运行时无法获取实际对象的泛型类型。您可以做的是检查列表中包含的对象的类型:

Class<?> foo = list.get(0).getClass();
Class foo=list.get(0.getClass();
该方法具有返回类型,其中可以是
参数化类型
。对我来说,如果在没有参数化类型的字段上调用,它就不会返回
参数化类型
。在这种情况下,它似乎返回
Class
。在这一点上,这个问题没有定论

至于您关于如何在运行时获取实际类型的问题:泛型类型信息在运行时被擦除。它仅用于确保编译时的类型安全。将实际类型为
ArrayList
的对象分配给静态类型为
List
的变量时,在运行时无法获取实际对象的泛型类型。您可以做的是检查列表中包含的对象的类型:

Class<?> foo = list.get(0).getClass();
Class foo=list.get(0.getClass();
该方法具有返回类型,其中可以是
参数化类型
。对我来说,如果在没有参数化类型的字段上调用,它就不会返回
参数化类型
。在这种情况下,它似乎返回
Class
。在这一点上,这个问题没有定论

至于您关于如何在运行时获取实际类型的问题:泛型类型信息在运行时被擦除。它仅用于确保编译时的类型安全。将实际类型为
ArrayList
的对象分配给静态类型为
List
的变量时,在运行时无法获取实际对象的泛型类型。您可以做的是检查列表中包含的对象的类型:

Class<?> foo = list.get(0).getClass();
Class foo=list.get(0.getClass();

我认为你想要实现的目标是不可能的。但是,对代码稍作修改就可以做到:

public class MyObject {
    private List<?> list;
    private Class<?> type;

    public <T> void setList(List<T> list, Class<T> c) {
        this.list = list;
        this.type = c;
    }

    public List<?> getList() {
        return list;
    }

    public Class<?> getType() {
        return type;
    }
}

我认为你想要达到的目标是不可能的。但是,对代码稍作修改就可以做到:

public class MyObject {
    private List<?> list;
    private Class<?> type;

    public <T> void setList(List<T> list, Class<T> c) {
        this.list = list;
        this.type = c;
    }

    public List<?> getList() {
        return list;
    }

    public Class<?> getType() {
        return type;
    }
}

我认为你想要达到的目标是不可能的。但是,对代码稍作修改就可以做到:

public class MyObject {
    private List<?> list;
    private Class<?> type;

    public <T> void setList(List<T> list, Class<T> c) {
        this.list = list;
        this.type = c;
    }

    public List<?> getList() {
        return list;
    }

    public Class<?> getType() {
        return type;
    }
}

我认为你想要达到的目标是不可能的。但是,对代码稍作修改就可以做到:

public class MyObject {
    private List<?> list;
    private Class<?> type;

    public <T> void setList(List<T> list, Class<T> c) {
        this.list = list;
        this.type = c;
    }

    public List<?> getList() {
        return list;
    }

    public Class<?> getType() {
        return type;
    }
}


但是如果在运行时设置,如何获取类型?列表在运行时()没有类型,所以这个问题没有真正意义。最好告诉我们您实际要做什么。但是如果我在运行时设置,如何获取类型呢?列表在运行时()没有类型,所以这个问题没有真正意义。最好告诉我们您实际要做什么。但是如果我在运行时设置,如何获取类型呢?列表在运行时()没有类型,所以这个问题没有真正意义。最好告诉我们您实际要做什么。但是如果我在运行时设置,如何获取类型呢?列表在运行时()没有类型,所以这个问题没有真正意义。最好告诉我们您实际想要做什么。这是一个很好的解决方法,但当列表中没有任何元素时,它将不起作用……是的,如果列表为空怎么办?@NielsBillen是的,在这种情况下它将不起作用;-)我喜欢你的答案,我曾经做过类似的事情。嗨,我已经编辑了代码。请查收。现在,我该如何获取类型?这是一个很好的解决方法,但当列表中没有任何元素时,它将不起作用……是的,如果列表为空怎么办?@NielsBillen是的,在这种情况下它将不起作用;-)我喜欢你的答案,我曾经做过类似的事情。嗨,我已经编辑了代码。请查收。现在,我该如何获取类型?这是一个很好的解决方法,但当列表中没有任何元素时,它将不起作用……是的,如果列表为空怎么办?@NielsBillen是的,在这种情况下它将不起作用;-)我喜欢你的答案,我曾经做过类似的事情。嗨,我已经编辑了代码。请查收。现在,我该如何获取类型?这是一个很好的解决方法,但当列表中没有任何元素时,它将不起作用……是的,如果列表为空怎么办?@NielsBillen是的,在这种情况下它将不起作用;-)我喜欢你的回答,我曾经做过类似的事情。嗨,我