关于Java:如何获取参数化的Class实例

关于Java:如何获取参数化的Class实例

How to get parametrized Class instance

由于引入了泛型,因此对Class进行了参数化,因此List.class生成Class 。 这很清楚。

我无法弄清楚的是如何获取本身已参数化的Class类型的实例,即Class >。 像下面的代码片段一样:

1
2
3
4
5
6
7
8
9
10
11
12
public class GenTest {
    static < T > T instantiate(Class< T > clazz) throws Exception {
        return clazz.newInstance();
    }
    public static void main(String[] args) throws Exception {
        // Is there a way to avoid waring on the line below
        // without using  @SuppressWarnings("unchecked")?
        // ArrayList.class is Class<ArrayList>, but I would like to
        // pass in Class<ArrayList<String>>
        ArrayList<String> l = GenTest.instantiate(ArrayList.class);
    }
}

我经常遇到这个问题的变种,但我仍然不知道,是否只是想念一些东西,或者真的没有更好的方法。 感谢您的建议。


Class类是一种类型的运行时表示。由于参数化类型在运行时会进行类型擦除,因此Class的类对象与Class >和Class >相同。

您无法使用.class表示法实例化它们的原因是,这是用于类文字的特殊语法。参数化类型时,Java语言规范特别禁止使用此语法,这就是为什么不允许List .class的原因。


我认为您无法做自己想做的事情。首先,您的实例化方法不知道它处理的是参数化类型(您可以轻松地将其传递给java.util.Date.class)。其次,由于擦除,在运行时对参数化类型进行特别特定的操作是困难的或不可能的。

如果您以不同的方式解决问题,则可以做其他一些小技巧,例如类型推断:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class GenTest
{
    private static <E> List<E> createList()
    {
        return new ArrayList<E>();
    }

    public static void main(String[] args)
    {
        List<String> list = createList();
        List<Integer> list2 = createList();
    }
}


类表示由类加载器加载的类,它们是原始类型。要表示参数化类型,请使用java.lang.reflect.ParameterizedType。


您唯一可以做的就是直接实例化List并调用其getClass()

1
instantiate(new List<String>() { ... }.getClass());

对于具有多个抽象方法(如List)的类型,这很尴尬。但是不幸的是,调用子类构造函数(例如new ArrayList)或工厂方法(Collections.emptyList())不起作用。


推荐阅读

    linux命令实例练习?

    linux命令实例练习?,工作,系统,设备,代码,命令,信息,基础,网络,目录,文本,lin

    linuxln命令实例?

    linuxln命令实例?,位置,数据,链接,地方,信息,文件,系统,概念,名字,盘中,ln命

    linuxln命令实例?

    linuxln命令实例?,位置,数据,链接,地方,信息,文件,系统,概念,名字,盘中,ln命

    linux基本命令实例?

    linux基本命令实例?,工作,地址,系统,信息,命令,标准,目录,基础,简介,功能,Lin

    linux启动实例的命令?

    linux启动实例的命令?,密码,软件,环境,系统,管理,情况,工具,数据,设备,位置,l

    查看linux类型命令?

    查看linux类型命令?,系统,信息,命令,状态,数据,数字,情况,地址,类型,文件,lin

    linux删除类型命令?

    linux删除类型命令?,系统,档案,命令,文件,名称,环境,数据,不了,目录,文件夹,

    查看linux库类型命令?

    查看linux库类型命令?,系统,工作,信息,状态,电脑,命令,工具,代码,地址,发行,

    linux网卡类型命令?

    linux网卡类型命令?,网络,系统,地址,信息,设备,状态,服务,名称,名字,网卡,如

    linux查看命令类型用?

    linux查看命令类型用?,信息,系统,情况,命令,实时,工作,设备,电脑,文件,类型,

    linux常用命令及实例?

    linux常用命令及实例?,系统,工作,地址,信息,标准,网络,管理,电脑,命令,目录,L

    linux命令三种类型?

    linux命令三种类型?,工作,地址,系统,标准,时间,管理,命令,目录,信息,文件,lin

    linux命令及实例讲解?

    linux命令及实例讲解?,系统,工作,管理,命令,信息,地址,标准,数据,单位,目录,l

    Python命名空间实例解析

    Python命名空间实例解析,异常,名字,空间,代码,培训,观察,地方,情况,变量,函

    python的数据类型

    python的数据类型,数字,较大,数据,培训,变量,表示,字符串,赋值,常量,小数,1.

    python的动态类型

    python的动态类型,代码,系统,类型,技术,培训,语言,静态,动态,错误,大发,为了