[转载] Java获取泛型T的类型 T.class

参考链接: Java中的抽象

import java.lang.reflect.ParameterizedType;

import java.lang.reflect.Type;

 

public class Main{

    public static void main(String[] args)

    {

        Foo<String> foo = new Foo<String>(){};

        // 在类的外部这样获取

        Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];

        System.out.println(type);

        // 在类的内部这样获取

        System.out.println(foo.getTClass());

    }

}

 

abstract class Foo<T>{

    public Class<T> getTClass()

    {

        Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];

        return tClass;

    }

输出: 

class java.lang.String

class java.lang.String 

上面的代码不是万能的,只有实例化T的子类才能按上述方法获得T的实际类型,  如果子类没有实例化T,则无法获取T的实际类型;  比如,class Child 并没有实例化T,所以得不到String.class; 

import java.lang.reflect.ParameterizedType;

import java.lang.reflect.Type;

 

public class Main{

    public static void main(String[] args){

        //区别在new Child<String>()没有{}匿名类

        Foo<String> foo = new Child<String>();

        // 在类的外部这样获取

        Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];

        System.out.println(type);

        // 在类的内部这样获取

        System.out.println(foo.getTClass());

    }

}

 

abstract class Foo<T>{

    public Class<T> getTClass()

    {

        Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];

        return tClass;

    }

}

 

class Child<T> extends Foo<T>{

输出: 

Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

    at com.hankcs.Main.main(Main.java:9)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    at java.lang.reflect.Method.invoke(Method.java:606) 

有一种解决方式,父类本身不获取泛型的具体类型,仅提供抽象方法,由子类来提供具体的类型 

public abstract class Foo<T> {  

    public abstract Class getEntityClass();  

}  

 

public class Child extends Foo<String> {  

    public Class getEntityClass() {  

        return String.class;  

    }  

}   

对于获取泛型的方法,比较完整的代码如下: 

import java.lang.reflect.ParameterizedType;

import java.lang.reflect.Type;

 

public class GenericsUtils {

    /**

     * 通过反射,获得定义Class时声明的父类的范型参数的类型. 如public BookManager extends

     * GenricManager<Book>

     * 

     * @param clazz The class to introspect

     * @return the first generic declaration, or <code>Object.class</code> if cannot be determined

     */

    public static Class getSuperClassGenricType(Class clazz) {

        return getSuperClassGenricType(clazz, 0);

    }

 

    /**

     * 通过反射,获得定义Class时声明的父类的范型参数的类型. 如public BookManager extends GenricManager<Book>

     * 

     * @param clazz clazz The class to introspect

     * @param index the Index of the generic ddeclaration,start from 0.

     */

    public static Class getSuperClassGenricType(Class clazz, int index)

            throws IndexOutOfBoundsException {

        Type genType = clazz.getGenericSuperclass();

        if (!(genType instanceof ParameterizedType)) {

            return Object.class;

        }

        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();

        if (index >= params.length || index < 0) {

            return Object.class;

        }

        if (!(params[index] instanceof Class)) {

            return Object.class;

        }

        return (Class) params[index];

    }

转载来源:  http://blog.csdn.net/wangjunjun2008/article/details/43970217  http://www.hankcs.com/program/t-class.html  https://www.cnblogs.com/sirab415/p/6133533.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自定义控件---重写Listbox实现item图标变换和item点击事件

博客开通有一阵了&#xff0c;就是没有时间写&#xff0c;遗憾啊。&#xff01; 这几天做了个排序的自定义控件&#xff0c;在listbox item里放是button 并支持图标的交替变换 效果如下&#xff1a; 把代码贴上&#xff1a;1using System; 2using System.Collections.…

[转载] Spring面试题整理

参考链接&#xff1a; Java中的动态方法Dispatch和运行时多态 Spring面试题整理 2018年03月07日 21:11:46 hrbeuwhw 阅读数&#xff1a;49116 Spring 概述 1. 什么是spring? spring 是个Java企业级应用的开源开发框架。Spring主要用来开发Java应用&#xff0c;但是有…

ansible: Linux批量管理神器

我们已经知道&#xff0c;基于集群可实现服务器横向扩展slace out。可是&#xff0c;当上百台主机集合成共同为一个站点提供web页面访问的形式时&#xff0c;怎么管理整个集群体呢&#xff1f; 一些小伙伴大概听说过pxe等可实现自动安装系统。可是&#xff0c;要我们一台一台主…

[转载] Python numpy函数:all()和any()比较矩阵

参考链接&#xff1a; Python中的any和all 数组元素的比对&#xff0c;我们可以直接使用“”进行比较&#xff0c;比如&#xff1a; 但是当数组元素较多时&#xff0c;查看输出结果便变得很麻烦&#xff0c;这时我们可以使用all&#xff08;&#xff09;方法&#xff0c;直接…

MySQL初识-架构-安装-初始化-连接-管理工具-数据文件

MySQL架构和结构分析 官方架构图 内部组件结构图 MySQL安装方式 MySQL初始化 MySQL工作模式及常用命令 交互式模式&#xff1a;mysql> 1234567891011121314# 交互式模式下的客户端命令mysql> help # 获取命令帮助 mysql> \? # 同上 mysql> \c # 取消命令执行 mysq…

[转载] Java基础——关联、聚合、组合

参考链接&#xff1a; Java中的关联 | 组合和聚合 一.引言 其实自己也不知道&#xff0c;在需求设计、架构设计、开发阶段是否真正需要弄明白“关联、聚合、组合”。原本计划这篇博文写“继承“和”多态”&#xff0c;但是一翻阅资料&#xff0c;基本上都会把“继承”和“组…

[转载] WSDL2Java详细使用说明【官方最全说明】

参考链接&#xff1a; Java中的this说明 WSDL to Java 命名 wsdl2java - 获取WSDL文档并生成完全带注释的Java代码&#xff0c;并实现相关服务。 概要 用例 : wsdl2java -fe|-frontend <front-end-name> -db|-databinding <data-binding-name> -wv <…

mdm.Dialogs.promptModal()使用

这是prompt的扩展&#xff0c;提供了更多的功能&#xff0c;比如可以添加其他按钮和图标import mdm.*;mdm.Application.init(this, onInit);function onInit():void {// 启动程序...}quit.addEventListener(MouseEvent.CLICK,quitProgram);function quitProgram(evt:MouseEvent…

[转载] JAVA 构造函数及其重载

参考链接&#xff1a; Java重载Overload public class Student{ public int stuId; public String stuName; public int stuAge; public int stuScore; public Student(){ } public Student(int sId,String sName){ stuId sId; sName stuName; } public Student(int sld,S…

学生机房虚拟化(十)系统操作设计实现

引入&#xff1a; 在前篇思路的指导下&#xff0c;进行了为期三个星期的调试最终建立了一个初步成熟的&#xff0c;具有亲和力的配置界面&#xff0c;现在此虚拟系统已经初步部署了一个机房&#xff0c;用来学生日常上课。在本篇中&#xff0c;本人并不试图去花篇幅讲解彼此之间…

[转载] java之重写toString

参考链接&#xff1a; Java程序的输出| 重写Override 1.toString()就是是重写&#xff0c;对于一般的对象来说都会有这个方法&#xff0c;其实这个方法的目的&#xff0c;主要就是将对象按字符串的方式输出出来&#xff1a;打个比方&#xff0c;比如一个People类&#xff0c;里…

Gson的使用,对于不需要html escape的情况的处理

引入&#xff1a; 虽然是小问题&#xff0c;但是我还是需要记录下&#xff0c;我们知道&#xff0c;Google提供了一个Gson框架让我们高效的吧普通对象&#xff08;一般VO为佳&#xff09; 和json字符串之间进行互转。因为转换多数是和浏览器打交道的&#xff0c;所以一般默认的…

[转载] Java 重写paint绘图

参考链接&#xff1a; 用Java重写Override 感谢原文&#xff1a;https://zhidao.baidu.com/question/260060153.html 这个方法需要注意的地方不多&#xff0c;也就是重写时&#xff0c;先调用 super.paint(g) 方法 paint方法不需要编写代码调用&#xff0c;只需要重写。 其他…

教你如何进入有密码的 XP 系统(下)

自动登录时禁用Shift键 当使用自动登录功能时&#xff0c;用户可通过按住Shift键忽略登录进程&#xff0c;输入其他用户名及密码进入电脑。该技巧可以禁用自动登录时的Shift键功能。操作步骤如下&#xff1a;打开“注册表编辑器”&#xff0c;找到[HKEY_LOCAL_MACHINE\Softwar…

[转载] 2020最新Java面试题,常见面试题及答案汇总

参考链接&#xff1a; Java程序的输出| 18(重写Override) 发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全&#xff0c;希望对大家有帮助哈~ 博主已将以下这些面试题整理成了一个Java面试手册&#xff0c;是PDF版的。 关注…

【心随笔】叙述你成功完成一件事情的方法

一、situation 先描述你曾经处于的困难状况 二、task / target 说一说你是怎样做出打算的 三、action / attitude 告诉别人你做出的行动 四、result 最后获得了怎样的成绩转载于:https://www.cnblogs.com/tnxlvlxy/p/7806142.html

[转载] java排序compareTo:降序输出学生成绩

参考链接&#xff1a; Java程序的输出| 18(重写Override) 一道简单程序题&#xff1a; 编写一个程序&#xff0c;输入学生的姓名、分数信息&#xff0c;要求程序按照成绩降序排序后并输出。 实现方法有很多 方法一 public class ScoreSort2 { private String name; pr…

300GB*6 SCSI RAID5 LINUX服务器数据恢复手记

[摘要]某数码冲印网站&#xff0c;采用DELL POWEREDGE2850服务器&#xff0c;存储部分由6块300G硬盘组成RAID5&#xff0c;LINUX平台&#xff0c;1.5T逻辑磁盘中只包含一个卷&#xff0c;文件系统为EXT3&#xff0c;存储所有客户数码照片&#xff0c;服务器的故障导致整个公司无…

[转载] public static void main(String[] args) 隐含了什么?

参考链接&#xff1a; 了解Java中“ public static void main”中的“ static” public class TestSort { public static void main(String[] args) { // 需要分别用Javac和Java命令行编译和运行 int[] arr; int temp 0; arr new int [9]; for (int i 0; i < arr.length…

在C#中创建DataTable

经常遇到对DataTable进行各种运算&#xff0c;这方面的资料经常散落在各处&#xff0c;使用起来不方面&#xff0c;我想还是把他们集中到博客中&#xff0c;下次要用到的时候可以直接查看。下面是创建一个空白的DataTable&#xff0c;并定义相关的字段&#xff1a;DataTable dt…