一般使用反射来获取泛型类型信息
如下代码:
package myGenetic;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;
public class GenericTest {
/*使用反射来获取泛型信息*/
private Map<String, Integer> score;
public static void main(String[] args) throws SecurityException, NoSuchFieldException {
//Class clazz = GenericTest.class;
Class<GenericTest> clazz = GenericTest.class;
//System.out.println(clazz);
Field f = clazz.getDeclaredField("score");
//直接使用getType只对普通类型有效,无法取到泛型参数
Class<?> a = f.getType();
System.out.println("score的类型是:"+a);
//获得Field实例f的泛型类型
Type gType = f.getGenericType();
//如果gType类型是ParameterizedType的对象
if (gType instanceof ParameterizedType) {
ParameterizedType pType = (ParameterizedType) gType;
//获取原始类型
Type rType = pType.getRawType();
System.out.println("原始类型是:"+rType);
//取得泛型类型参数
Type[] tArgs = pType.getActualTypeArguments();
System.out.println("泛型类型是:");
for (int i = 0; i < tArgs.length; i++) {
System.out.println("第"+i+"个泛型类型是:"+tArgs[i]);
}
}else{
System.out.println("获取泛型类型出错!");
}
}
}
输出结果如下:
score的类型是:interface java.util.Map
原始类型是:interface java.util.Map
泛型类型是:
第0个泛型类型是:class java.lang.String
第1个泛型类型是:class java.lang.Integer
还有一个较好的例子,多用于实现BaseDAO,代码如下:
package myGenetic;
import java.lang.reflect.ParameterizedType;
class SubClass extends SuperClass<Person> {
public SubClass() {
super();
}
}
class Person {
public Person() {
super();
}
public void function() {
System.out.println("function in Person.class...");
}
}
public abstract class SuperClass<T> {
private Class<T> clazz;
@SuppressWarnings("unchecked")
public SuperClass() {
clazz = (Class<T>) ((ParameterizedType) super.getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
public Class<T> getClazz() {
return clazz;
}
public void setClazz(Class<T> clazz) {
this.clazz = clazz;
}
/**
* 普通的非泛型类Class
* 泛型化的类Class<T>
* JDK中,普通的Class.newInstance()方法的定义返回Object,要将该返回类型强制转换为另一种类型;
* 但是使用泛型的Class<T>,Class.newInstance()方法具有一个特定的返回类型;
* @param args
*/
public static void main(String[] args) {
SuperClass<Person> subClass = new SubClass();
//1.得到泛型类T实际的完整类名
System.out.println(subClass.getClazz());
//2.得到泛型类T的对象
try {
System.out.println(subClass.getClazz().newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//3.调用泛型类T的方法
try {
subClass.getClazz().newInstance().function();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
输出结果如下:
class myGenetic.Person
myGenetic.Person@10d448
function in Person.class...
分享到:
相关推荐
在Java编程语言中,泛型是一种强大的特性,它允许我们在定义类、接口和方法时引入类型参数,从而实现参数化类型。然而,Java的泛型并非像C++或C#那样在运行时存在,而是在编译期间经历一个称为“类型擦除”的过程。...
8. **类型推断**:Java 5及后续版本提供了类型推断,编译器可以根据上下文自动推断类型参数,简化代码。例如,`List<String> list = new ArrayList();` 9. **泛型和枚举**:泛型也可应用于枚举类型,为每个枚举常量...
Java泛型是Java编程语言中一个强大的特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。泛型的主要目标是提高代码的类型安全性和重用性,减少类型转换的麻烦,并在编译时捕获可能的类型错误。...
Java 泛型编程是一种强大的工具,它允许我们在编写代码时引入类型参数,从而提高了代码的灵活性和安全性。泛型在Java中主要应用于类、接口和方法,使得程序员可以在编译时检查类型安全,并且可以消除运行时的类型...
泛型是Java 5引入的新特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的类型安全性和可读性。在`BaseDao.java`中,可能会定义一个泛型基类,如: ```java public abstract class BaseDao<T> { public...
- 也可以使用类型参数`<?>`来表示父类的泛型类型不确定,这样在子类中可以操作父类的方法,但不能访问具体的泛型类型信息。 7. **野指针警告** - 在未使用泛型的旧代码中,可能会出现“可能的不匹配类型”警告。...
在 Java 中,可以通过在类、接口或方法的声明中添加尖括号 `< >` 来引入类型参数。例如,在 `List<E>` 中,`E` 就是一个类型参数,代表 “Element”。这使得 `List` 接口能够接受任何类型的元素,同时在编译时保留...
自Java 7起,编译器支持类型推断,允许在某些情况下省略类型参数。例如,当我们调用泛型方法时,编译器可以通过上下文自动推断出类型。 10. 泛型与反射 虽然泛型在运行时被擦除,但反射仍然可以在某种程度上检测...
Java中的泛型主要通过类型参数来实现。类型参数(或称为类型变量)是一个标识符,用于表示一个未知的具体类型。在定义泛型类或方法时,这些类型参数被放在类名或方法签名之后的一对尖括号`<>`内。 例如,在`java....
在Java中,泛型通常以尖括号 `<T>` 表示,其中 `T` 是类型参数,可以代表任何引用类型。 - 类如 `class Java_Generics,V>`,`K` 和 `V` 就是类型参数,类似于函数中的变量,它们在实例化时会被具体的类型替换。 - ...
Java 泛型是自Java SE 1.5版本引入的一种强大的编程工具,它允许在类、接口和方法中使用类型参数,从而实现了参数化类型。泛型的主要目标是提高代码的安全性和可重用性,同时减少类型转换的繁琐。 ### 1. 泛型的...
在编译过程中,类型参数被替换为它们的边界类型(通常是Object),因此不同泛型参数的实例(如List和List)在运行时共享相同的类表示。这就是为什么`list1.getClass() == list2.getClass()`会返回true的原因。类型...
1. 泛型类:泛型类是在类定义时引入类型参数的,比如`class Box<T>{ T item; }`,这里的`T`就是类型参数,代表任意类型。在创建对象时,我们可以指定具体的类型,如`Box<String> box = new Box();`,这样box就只能...
Java泛型是Java语言的一个重要特性,它允许在类、接口和方法中声明类型参数,从而提高了代码的复用性和安全性。这个特性自Java 5引入以来,极大地改善了Java的类型系统,降低了类型转换异常的风险。 1. **使用泛型...
Java 泛型是Java SE 5.0引入的一项重要特性,它允许在定义类、接口和方法时使用类型参数,从而实现对多种数据类型的统一处理。泛型的主要目的是提高代码的类型安全性和重用性,避免了运行时的类型转换,并且在编译...
Java 泛型是 Java 编程语言中一个强大的特性,它允许在类、接口和方法中使用类型参数,从而增加了代码的复用性和安全性。在本文中,我们将深入探讨 Java 泛型的各种方面。 首先,普通泛型允许我们在定义类时引入一...
Java泛型通配符是Java编程语言中一个重要的特性,它允许我们在定义泛型类型时使用问号(?)作为占位符,表示任意类型的参数。这种通配符的使用大大提高了代码的灵活性和可复用性,同时也帮助开发者遵循强类型检查的...