泛型真实类型

把项目中的代码抽出父类,有时需要用泛型。如果此时涉及到hibernate等数据库操作,比如"select u from User u",那么User怎么怎么表示出来呢?以下是研究的代码:

父类:

import static org.junit.Assert.*;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import org.junit.Test;

public class Father<T> {

	public Father() {
		// TODO Auto-generated constructor stub
		System.out.println(this.getClass());//class mypss.children
		System.out.println(this.getClass().getSuperclass());//mypss.Father
		System.out.println(this.getClass().getGenericSuperclass());//mypss.Father<java.lang.Long> 带上了泛型
		ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass();
		Type[] actualTypes = parameterizedType.getActualTypeArguments();
		System.out.println(actualTypes[0]);//class java.lang.Long 真实的泛型类型,Long
		Class<T> actualType = (Class<T>) actualTypes[0];
		System.out.println(actualType);
	}

}

子类:

package mypss;

import static org.junit.Assert.*;

import org.junit.Test;

public class children extends Father<Long> {

	@Test
	public void testde() throws Exception {
		System.out.println("子类");
	}
}
时间: 2024-08-10 22:28:05

泛型真实类型的相关文章

泛型类中,获取当前new的对象的 T的真实 类型

public abstract class BaseDaoImpl<T> implements BaseDao<T> { @Resource private SessionFactory sessionFactory; private Class<T> clazz; public BaseDaoImpl() { // 使用反射技术得到T的真实类型 ParameterizedType pt = (ParameterizedType) this.getClass().get

Java泛型:类型擦除

类型擦除 代码片段一 Class c1 = new ArrayList<Integer>().getClass(); Class c2 = new ArrayList<String>().getClass(); System.out.println(c1 == c2); /* Output true */ 显然在平时使用中,ArrayList<Integer>()和new ArrayList<String>()是完全不同的类型,但是在这里,程序却的的确确会输

C#学习笔记三: C#2.0泛型 可控类型 匿名方法和迭代器

前言 C#1.0的委托特性使方法作为其他方法的参数来传递,而C#2.0 中提出的泛型特性则使类型可以被参数化,从而不必再为不同的类型提供特殊版本的实现方法.另外C#2.0还提出了可空类型,匿名方法和迭代器3个优美的特性. 1,泛型1.1 泛型是什么泛型的英文表述是"generic", 这个单词意为通用的.从字面意思可知,泛型代表的就是"通用类型",它可以代替任意的数据类型,使类型参数化,从而达到之实现一个方法就可以操作多种数据类型的目的.泛型是将方法实现行为与方法操

如何使用反射技术获取泛型类的真实类型?

平常我们需要获取某个类的类型,一般是直接使用 "实例.getClass()",获取 "类名 .class" 直接获取 . 例如: 假设此时有一个User类,那么要获取该User类的真实类型的话,可以直接使用类名+".class"获取: "User.class" 或者,通过User类的实例 user.getClass() 来获取: 上面两个例子是已经确定是User类型了,所以,才可以使用上面的方法. 而泛型类因为还不能确定是什么

java中利用反射机制绕开编译器对泛型的类型限制

首先看下面这个例子 public static void main(String[] args) { ArrayList<Integer> al1 = new ArrayList<Integer>(); al1.add(1); ArrayList<String> al2 = new ArrayList<String>(); al2.add("hello"); //int型链表和string型链表,结果为true System.out.pr

自己写一个泛型集合类型,可实现添加和遍历

在"C#中List<T>是怎么存放元素的"中,分析了List<T>的源码,了解了List<T>是如何存放元素的.这次,就自定义一个泛型集合类型,可实现添加元素,并支持遍历. 该泛型集合类型一定需要一个添加元素的方法,在添加元素的时候需要考虑:当添加的元素超过当前数组的容量,就让数组扩容:为了支持循环遍历,该泛型集合类型必须提供一个迭代器(实现IEnumerator接口). public class MyList<T> { T[] item

泛型 Generic 类型擦除引起的问题及解决方法

参考:http://blog.csdn.net/lonelyroamer/article/details/7868820#comments 因为种种原因,Java不能实现真正的泛型,只能使用类型擦除来实现伪泛型,这样虽然不会有类型膨胀的问题,但是也引起了许多新的问题.所以,Sun对这些问题作出了许多限制,避免我们犯各种错误. 1.先检查,再编译,以及检查编译的对象和引用传递的问题 既然说类型变量会在编译的时候擦除掉,那为什么我们往ArrayList<String> arrayList=new

struts2学习笔记(3)---Action中訪问ServletAPI获取真实类型的Servlet元素

一.源码: struts.xml文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <s

限制泛型可用类型,类型通配符声明,泛型方法

一.限制泛型可用类型 ①   在定义泛型类型时,默认在实例化泛型类的时候可以使用任何类型,但是如果想要限制使用泛型类型时,只能用某个特定类型或者是其子类型才能实例化该类型时,可以在定义类型时,使用extends关键字指定这个类型必须是继承某个类,或者实现某个类; ②   当没有指定泛型继承的类型或接口时,默认使用extends Object,所以默认情况下任何类型都可以作为参数传入; 继承抽象类 1 public class GenericDemo3{ 2 public static void