获得类的泛型:
有一个类:
public class Test<T>
{
}
现在想获得T的Class。在JAVA目前的泛型机制下,不可能。(原因参见JAVA泛型机制。说白了就是泛型是在编译期获得的,而且有擦除机制。所以在编译前,JAVA也不知道T是啥,编译后,JAVA知道了然后忘记了。囧)
网上流传过一个方法,就是写下一个Test类的子类,然后在子类中调用类似
Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
这样的代码来获得T的Class 。 遗憾的是,这是个笑话,或者说没有满足我们的需求,因为要想用上面的代码,Test的子类必须这么写:
public class SonOfTest extends Test<String>{
}
否则会报类型转换异常:sun.reflect.generics.reflectiveObjects.TypeVariableImpl
仔细看上面的SonOfTest,你会发现 Test<String>这一段。就是说在继承的时候我们必须事先知道T的类型是String.
并且为String专门做一个子类。这样一来就利用多态机制绕过了这个问题。泛型的可能性少,这方法有用,如果很多的话,为每一个可能性都写个对应的子类那是坑爹呢。
所以我在这里遗憾的告诉大家,这是个死穴。
当然在这里我们还能用一个变通的方法解决我们的问题,就是不用泛型机制了,绕过去(当然这个方法也许不优美或者不一定适用)。
我们只要把Test类改造成下面这样:
public class Test<T> {
private Class<T> clazz; //这就是我们想要得到的T的Class
public Test(Class<T> clazz)
{
this.clazz = clazz; //T的Class就是这么得到的,囧
}
}
是的,很简单,就是在Test构造的时候直接通过参数把T的Class告知就行。
使用的时候是这样的:
Test<String> test = new Test(String.class);
别打我。这是没办法的办法。话说回来,你既然在创建Test的时候,已经知道泛型的Class是个String,何苦不用简单的参数形式来获得,而非要用走不通的路去获得它呢?
获得方法参数的泛型:
想获得某个类的方法或者成员的泛型,就很简单,应为JAVA提供了方法,抛砖引玉:
String genericType = method.getGenericParameterTypes()[0].toString().split("<")[1].split(">")[0];
System.out.println(genericType);
分享到:
相关推荐
Java试题-3:反射和泛型的综合应用 Java反射 泛型都是比较高级的应用技术
Java语言程序设计:ch05 泛型、枚举与for语句的简化写法.ppt
现在无论做什么应用,基本上都会有涉及对象... 其实,利用Java面向对象的基本特性及JDK5新引入的泛型语法,我们可以创建通用的DAO对象的CRUD方法,同时又可保证类型的安全性。下面DAO的实现以Hibernate为基础加以演示。
AcmeAppGenerics:集合和泛型的仓库
主要介绍了Java泛型的用法及T.class的获取过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
泛型类型:定义泛型类型时,使用尖括号,并在尖括号中指定类型参数。例如,List表示一个字符串类型的列表。 泛型方法:定义泛型方法时,在方法名后面使用尖括号,并在尖括号中指定类型参数。例如,public static <T>...
姓名Type :: Utils :: Generics-轻松创建泛型类型概要use Type::Utils::Generics qw( class_generics T );package Queue { use Moo; use Types::Standard -types; has data => ( is => 'ro', isa => ArrayRef, ...
const-buffer:使用const泛型在堆栈上分配的固定容量的内存缓冲区
staticvec:使用const泛型实现由数组支持的固定容量堆栈分配的Vec替代方案
C++设计新思维:泛型编程与设计模式之应用.pdf 带目录书签
public class Father,V> -------整个叫泛型 K,V ----泛型参数 2;定义子类时直接为父类泛型参数赋值 public class Son:Father,V> public class Son:Father,string> 一个泛型子类继承一个泛型父类时,可以直接...
C++/CLI泛型编程概览 CLI泛型介绍 CLI泛型适用对象 CLI泛型约束 CLI泛型与C++模板 讲座总结 Q&A
前言:这一章来总结下C#泛型技术的使用。据博主的使用经历,觉得泛型也是为了重用而生的,并且大部分时候会和反射一起使用。这次还是打算围绕WWH(即What、Why、How)来讲解。 1、什么是泛型:通过参数化类型来...
• 全面总结Ja• 全面总结Java泛型v• 全面总结Ja• 全面总结Java泛型va泛型a泛型• 全面• 全面总结Java泛型• 全面总结Java泛型总结Java泛• • 全面总结Java泛型全面总结Java泛型型• • 全面总结Java泛型全面...
C++设计新思维:泛型编程与设计模式之应用
TypedArrays PHP的泛型替代。 实现定义类型的数组。要求需要PHP> = 7.4安装composer require chemaclass/typed-arrays吉特·胡克斯(Git Hooks) 使用./tools/git-hooks/init.sh启用git钩子
3):给泛型类 加类型(引用类型,值类型)的约束:where T:class,new ( )遇到的问题:在写MongodbHelper类的时候,为了能处理多种类别,所以如下定义了该类: 代码如下: public class MongodbHelper { 。...
java 泛型详解 实例 class Point class Notepad,V>{ // 此处指定了...通配符、受限泛型、泛型无法向上转型、泛型接口、泛型方法、通过泛型方法返回泛型类型实例、使用泛型统一传入的参数类型、泛型数组、泛型的嵌套设置
Java语言程序设计:第七章 泛型.ppt