`
eueuy
  • 浏览: 74513 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
社区版块
存档分类
最新评论

总结:关于得到泛型的Class

阅读更多

获得类的泛型:

有一个类:

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);

 

 

0
0
分享到:
评论

相关推荐

    java泛型类和函数

    这种机制在Java 5中被引入,并在集合框架(如`List`、`Set`和`Map`等)中得到了广泛应用。 #### 泛型的优点 - **类型安全**:使用泛型可以避免运行时的`ClassCastException`异常。 - **代码重用**:通过使用泛型,...

    Java 泛型总结(二):泛型与数组

    Java 泛型总结(二):泛型与数组 Java 中泛型数组的关系确实有些复杂,不允许直接创建泛型数组,本文将分析其中的原因,并总结一些创建泛型数组的方式。 首先,让我们看看数组和泛型的关系。数组相比于 Java ...

    泛型编程 时间测试

    总结而言,泛型编程提供了编写高效、灵活代码的能力,而时间测试则帮助我们了解这些泛型实现的实际性能。通过深入理解泛型的原理和应用,我们可以编写出既安全又高效的代码,并在各种场景下获得理想的时间性能。在...

    java泛型编程

    - **反射限制**:使用反射时无法直接获得泛型信息,因为这些信息已经被擦除了。 #### 五、泛型的实际应用案例 假设我们需要编写一个通用的`swap`方法,用于交换容器中任意类型的两个元素的位置。我们可以利用泛型...

    TypeScript泛型类 - 把类作为参数类型的泛型类.zip

    在这个“TypeScript泛型类 - 把类作为参数类型的泛型类”示例中,我们将深入探讨如何利用泛型在TypeScript中创建灵活的、可复用的类模板。 泛型是TypeScript中的一个核心概念,它允许我们在编写代码时定义和重用...

    Java 泛型总结及详解

    通过理解和掌握Java泛型,开发者可以在编写代码时得到更多编译器的帮助,增强程序的类型安全性,同时降低运行时异常的风险,提高代码质量。在实际开发中,合理使用泛型可以显著提升代码的可读性、可维护性和效率。

    C#基础之泛型

    在C#编程语言中,泛型是一种强大的特性,它首次出现在C# 2.0版本,并且得到了公共语言运行库(CLR)的支持。泛型的主要目标是提供类型安全、高效的数据容器,避免了不必要的装箱拆箱操作,从而提升了性能。本文将深入...

    Java中泛型的用法总结

    Java中的泛型是一种强大的工具,它允许我们在编程时指定容器(如列表、集合等)能够存储的数据类型。泛型提供了一种方式来增强类型检查,防止在运行时出现类型不匹配的问题,从而提高代码的健壮性和安全性。下面是对...

    NET泛型编程秘笈

    泛型不仅仅是一项语言级别的特性,它也得到了CLR(Common Language Runtime)层面的支持。这意味着当编译泛型代码时,CLR会生成泛型方法或类的实例化版本,从而在运行时能够高效地处理不同类型的数据。这对于优化...

    泛型编程与设计新思维.docx

    随着1998年国际C++标准的正式发布,泛型编程作为一种强大的抽象机制得到了广泛的关注和支持。泛型编程不仅增强了C++语言的灵活性,还提高了代码的复用性和可维护性。本文将深入探讨泛型编程的概念、原理及其在现代...

    ocjp题库 1z0-851

    1. 题目一关于泛型的使用和类型安全警告。Java在引入泛型之前,集合类中的元素类型是Object。在使用时必须进行类型转换。泛型的引入允许程序员在编译时获得类型检查和消除类型转换。为使这段代码能够使用泛型并避免...

    Java重要的泛型使用方法.docx

    ### Java泛型的重要使用方法 #### 一、引言与背景 在软件开发过程中,我们经常需要编写可重用的代码来处理不同类型的对象。例如,假设我们需要创建一个`MyArrayList`类,它可以用来存储一系列的数据,并提供添加和...

    java面试题_.doc

    - **Class对象**:通过类名.class或者对象.getClass()获得Class对象。 - **newInstance()**:利用Class对象创建实例。 - **getDeclaredMethods()**、**getDeclaredFields()**等方法获取类的成员信息。 ### 实战应用...

    如何使用Java泛型映射不同的值类型

    总结来说,Java泛型可以用来创建类型安全的映射,允许我们在容器中存储不同的值类型。通过使用类型安全的异构容器设计模式,我们可以保留类型信息并在编译时强制执行类型约束,从而提高代码的可靠性和可维护性。不过...

    TypeScript 入门教程从 JavaScript 程序员的角度总结思考,循序渐进的理解 TypeScript.zip

    1. **类型系统**:TypeScript 提供了丰富的类型系统,包括基本类型(如 number、string、boolean)、枚举(enum)、接口(interface)、类(class)等。通过类型注解,我们可以确保代码在编译阶段就捕获到潜在的类型...

    Java基础总结

    一旦获得了`Class`对象,就可以通过其提供的`newInstance()`方法创建该类的一个新实例。 ```java Object o = c1.newInstance(); ``` **获取类的属性和方法**: - 获取所有声明的字段:`getDeclaredFields()` - ...

    Accelerated C# 2005

    public class GenericClass { private T data; public void SetData(T data) { this.data = data; } public T GetData() { return data; } } ``` **2. 匿名方法** - **定义**:匿名方法是一种没有...

    ClassLibrary3.rar

    《深入解析.NET Framework中的...总结,"ClassLibrary3"作为.NET Framework的一个实例,展示了类库在软件开发中的核心价值。通过对类库的深入理解,我们可以更好地设计和实现自己的代码库,提高代码质量和开发效率。

    OCP java SE7 Programmer II Certification Guide

    根据提供的文件信息,“OCP Java SE7 Programmer II Certification Guide”主要针对的是希望获得Oracle Certified Professional (OCP) Java SE7 Programmer II认证的专业人士。本书详细介绍了备考1Z0-804考试所需...

    C#集合框架全景:探索.NET中的类型宝库

    ### C#集合框架全景:探索.NET中的类型宝库 C#是一种由微软开发的现代、面向对象的...从简单的数组到高级的数据结构,集合框架确保了高效的数据管理,并且随着.NET平台的发展,这些集合类型也在不断地得到改进和完善。

Global site tag (gtag.js) - Google Analytics