文档章节

Java 获得 泛型类型

h
 hn_old_man
发布于 2016/07/15 15:58
字数 304
阅读 41
收藏 3

对于Class而言T已经被擦拭为Object,而真正的T参数被转到使用T的方法 (或者变量声明或者其它使用T的地方)里面(如果没有那就没有存根),所以无法反射到T的具体类别,也就无法得到T.class。而 getGenericSuperclass()是Generic继承的特例,对于这种情况子类会保存父类的Generic参数类型,返回一个 ParameterizedType,这时可以获取到父类的T.class了,这也正是子类确定应该继承什么T的方法。

public class param<T1, T2> {
	class A {}
	class B extends A {}
	
	private Class<T1> entityClass;
	protected param (){
		Type type = getClass().getGenericSuperclass();
		System.out.println("getClass()==" + getClass());
		System.out.println("type = " + type);
		Type trueType = ((ParameterizedType)type).getActualTypeArguments()[0];
		System.out.println("trueType1 = " + trueType);
		trueType = ((ParameterizedType)type).getActualTypeArguments()[1];
		System.out.println("trueType2 = " + trueType);
		this.entityClass = (Class<T1>)trueType;
		
		B t = new B();
		type = t.getClass().getGenericSuperclass();
	
		System.out.println("B is A's super class :" + ((ParameterizedType)type).getActualTypeArguments().length);
	}
}

public class subParam extends param<Myclass, Myinvoke> {
	public static void main(String[] args) throws Exception{
		subParam  s = new subParam();
	}
}

输出:

getClass()==class com.example.test.subParam
type = com.example.test.param<com.example.test.Myclass, com.example.test.Myinvoke>
trueType1 = class com.example.test.Myclass
trueType2 = class com.example.test.Myinvoke
B is A's super class :0


贴一个看到代码

public class RawDao<T> {
    protected Class<T> clazz;

    @SuppressWarnings("unchecked")
    public RawDao() {
        @SuppressWarnings("rawtypes")
        Class clazz = getClass();

        while (clazz != Object.class) {
            Type t = clazz.getGenericSuperclass();
            if (t instanceof ParameterizedType) {
                Type[] args = ((ParameterizedType) t).getActualTypeArguments();
                if (args[0] instanceof Class) {
                    this.clazz = (Class<T>) args[0];
                    break;
                }
            }
            clazz = clazz.getSuperclass();
        }
    }

 

© 著作权归作者所有

h
粉丝 0
博文 16
码字总数 3567
作品 0
郑州
私信 提问
Kotlin 泛型 VS Java 泛型

建议先阅读我的上一篇文章 -- Java 泛型 和 Java 泛型一样,Kotlin 泛型也是 Kotlin 语言中较难理解的一个部分。Kotlin 泛型的本质也是参数化类型,并且提供了编译时强类型检查,实际上也是伪...

JohnnyShieh
2018/06/11
0
0
提给程序员和开发者的 10 道 Java 泛型面试题

关于泛型的面试题在 Java面试中变得越来越常见,因为 Java 5问世已经有相当长的时间了,越来越多的应用已经迁移到Java 5上来了,并且几乎所有新的Java开发工作也都是在Tiger(Java 5的项目代号...

lwei
2013/10/18
13.6K
30
Java语言学习(十一):枚举类型和泛型

Java中一个重要的类型:枚举,它可以用来表示一组取值范围固定的变量,使用 enum 关键字定义枚举类型,其中元素不能重复,通常大写表示。利用Java的反射机制,可以在运行时分析类,如查看枚举...

海岸线的曙光
2018/07/18
114
0
Cannot make a static reference to the non-stati...

今天碰到这样一些错误,Eclipse提示Cannot make a static reference to the non-static type T。代码如下: public class DAOFactory<D extends TemplateDAO<B>, B> {private static Map<Str......

开源中国驻成都办事处
2013/05/30
3K
0
Java反射——Type接口详解

Type的简介 java.lang.reflect.Type接口及其相关接口用于描述java中用到的所有类型,是Java的反射中很重要的组成部分。 在API文档中,Type接口的说明如下: Type 是 Java 编程语言中所有类型...

猴亮屏
09/02
69
0

没有更多内容

加载失败,请刷新页面

加载更多

vue入门--简单路由配置

本文转载于:专业的前端网站➜vue入门--简单路由配置   在初始化vue init webpack <工程名>时,有一步是询问是否安装vue-router,选择yes,如果没有安装的话,后面需要自己安装。然后在目录...

前端老手
15分钟前
3
0
怎么给视频配音

很多刚开始尝试视频制作的小伙伴,帮助到怎么给制作完成的视频配音,其实给视频配音的方法非常简单,在手机上可以进行制作,下面一起来看看给视频配音的方法吧! 具体步骤如下: 1、首先在手...

白米稀饭2019
24分钟前
2
0
windows批处理bat脚本编写

什么是bat脚本 .bat结尾的文件其实就是windows上的批处理脚本,Windows中的bat文件相当于 Linux中shell编程的.sh脚本,批量执行DOS命令。 其最简单的例子,是逐行书写在命令行中会用到的各种...

孙幼凌
32分钟前
3
0
华为手机翻译功能怎么使用?这三种方法请务必收藏

华为手机翻译功能怎么使用?在我们的生活中会经常遇到翻译问题,许多外语不好的朋友该怎么办呢?华为手机已经为我们解决了这个问题,今天小编就教大家学会使用华为手机中的三种翻译技巧,需要...

翻译小天才
40分钟前
4
0
企业服务软件开发中需要注意的三个问题

在开发企业服务软件时,我们需要分为:业务需求、用户需求、产品需求,三大需求层次,三个层次互相关联,企业服务软件开发首先要服务业务,需要满足业务的需求,再关注用户体验,也就是用户需...

积木创意科技
43分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部