前几天写框架碰到T.class的问题,因为无法在一个类或者方法里得到T.class, 所以必须得靠一个参数把T.class传进去, 今天,想起这个问题,就搜了一下,在网上看到一篇文章(http://www.mscto.com/JavaScript/2009010958837.html),里面说可以得到类级别的T.class。 方法如下:
Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Java中的泛型采用擦拭法。无法得到自己本身的泛型。而调用getGenericSuperclass()方法得到的是父类的泛型。不过一般也能解决问题。只要知道他的限制就行了,因势利导吧。
如果你想用一个Base类实现一些接口方法(只是实现方法,并没有实现全部方法,也不是实现接口),而且一个子类extends的这个Base类,由于你不会再在子类中实现同样的方法,所以Base类里的方法必须声明为public, 而且不是一般的Base类里可以是protected方法。
还有一个问题,如果你想使用CGLib来做代理的话,可能这种方法不行。因为CGLib是通过扩展和增强原来的类实现代理的,而这里的getClass()得到的很可能是CGLib生成的子类,这样就不能强制转换成ParameterizedType类型。大家在具体使用中注意这一点。
还需要得到方法里的T.Class,而且是静态方法,不知道能不能实现? 后来得到的答案是不能。 正如上面所讲的Java中的泛型采用擦拭法, 而且静态方法是可以被任何地方和其他任何方法调用的,根本就不会有Base类的“泛型T”,也就无法得到T.class。
以前都用JDK1.4, 最近公司才决定放弃1.4,这才开始研究泛型。
分享到:
相关推荐
介绍获取方法的参数和返回值类型(包括Type和Class)获取泛型参数类型(包括对象的泛型参数或集合元素的泛型类型)方法首先我们定义一个类:public cla
1. 通过 Class 的 forName(String name) 方法传入一个类的完整类路径,也可以获得Class 对象,但由于使用的是字符串,必须强制转换才可以获取泛型的Class<T>的Class对象,并且你应该考虑到这个方法可能抛出的 ...
4. 泛型的类型参数不能是泛型类型自己,例如GenericClass<T>等。 泛型是Java语言中的一种重要机制,用于在编译期检查类型安全,避免在运行期引发ClassCastException。泛型的使用可以使得Java语言更加灵活和强大,但...
使用这两个泛型单例设计模式,我们可以直接继承它们来创建自己的单例类,并使用T.Instance来取得该类的唯一实例。 例如: ```csharp public class MyClass : Singleton { // ... } public class MyMonoBehaviour ...
1. Class类:获取类的信息,创建对象,调用方法。 2. 构造器反射:动态创建对象。 3. 方法和字段反射:动态调用方法,访问字段。 九、泛型 1. 泛型的定义和使用:限制类型参数,提高代码安全性。 2. 泛型通配符:...
在类型判定中,我们可以使用 is 关键字来判定类型,也可以使用 GetType() 方法来取得值的类型或泛型类型进行判定。例如: if (tempa is int) { add = (int)tempa + (int)tempb; } else if (tempa is float) { add...
- 泛型约束,如where T : class或where T : struct。 4. **LINQ**: - 查询表达式(查询语法)和方法链(扩展方法)两种使用方式。 - Lambda表达式在LINQ中的应用,如Select、Where、GroupBy等操作。 5. **异步...
2. 泛型:深入理解泛型的概念,包括泛型类、泛型接口、泛型方法等,以及协变和逆变的使用。 3. 异步编程:掌握异步编程模型,包括async/await关键字,以及Task和Task<T>的使用。 4. ADO.NET与数据库交互:学习如何...
- 泛型列表(List<T>)和泛型字典(Dictionary<TKey, TValue>)是常见的泛型容器。 6. **IO与数据流**: - 文件I/O操作包括读写文件、追加、移动文件指针等。 - 数据流用于处理输入/输出,如StreamReader和...
★ 当把"智能指针/stl迭代器/C指针/前三者嵌套"都视为指针时,其内的最终值(非指针值)是一致的,在模板函数中,某些场景需要取得其最终的非指针值。 应用场景:转发模板函数,如 template<typename T> void ...
泛型允许创建类型参数化的类、接口和方法,提高代码复用,减少类型转换,提高类型安全性。 八、LINQ(Language Integrated Query) LINQ是C#中集成的查询语言,简化了数据查询操作,支持数据库、XML和集合等多种...
6. **泛型**:学习泛型容器类,如List<T>、Dictionary<TKey, TValue>等,以及泛型接口和泛型方法的使用。 7. **匿名方法与Lambda表达式**:理解匿名函数和Lambda表达式的语法,以及它们在LINQ查询中的作用。 三、...
4. **泛型**:C#的泛型允许在不指定具体类型的情况下编写代码,提高了代码的可重用性和效率,如泛型集合(List<T>、Dictionary<TKey, TValue>等)。 5. **异常处理**:通过try-catch语句块来捕获和处理运行时可能...
public class GenericStack<T> { private List<T> items = new List<T>(); public void Push(T item) { items.Add(item); } public T Pop() { T item = items[items.Count - 1]; items.RemoveAt(items....
- 泛型容器:如List<T>、Dictionary<TKey, TValue>等,它们提供了强大的数据存储和操作功能。 5. 高级特性 - 枚举:用于定义一组相关的值,通常用于开关或状态表示。 - 析构函数:用于对象销毁时进行清理工作。 ...
- **Class类**:如何获取Class对象,创建实例,调用方法。 - **注解**:自定义注解和元注解的使用,注解处理器。 15. **JVM**: - **内存模型**:堆、栈、方法区、本地方法栈的理解。 - **垃圾收集**:GC的基本...
- List<T>、Dictionary<TKey, TValue>等集合类提供了动态数组和键值对的存储功能。 - 泛型允许在不指定具体类型的情况下创建集合,提高代码的可复用性。 9. **LINQ(Language Integrated Query)**: - LINQ是C#...
public class GenericStack<T> { private T[] elements; private int top; public void Push(T item) { elements[top++] = item; } public T Pop() { if (top == 0) throw new InvalidOperationException(...
1. 类(Class):C#中的核心构造块,用于封装数据和方法。 2. 对象(Object):类的实例,具有特定的数据和行为。 3. 函数(Method):执行特定任务的代码块,也称为方法。 4. 变量(Variable):存储数据的容器。 5...
- **示例**:`template<typename T> class Pair { T first, second; public: Pair(T f, T s) : first(f), second(s) {} };` ### 智能算法相关知识点 考虑到比赛的主题是“智能算法”,以下是一些可能与比赛相关的...