对java泛型的理解
正确的应用java泛型的特性可以更好的实现编程的开闭原则(对扩展开放,对修改关闭),这得益于java泛型提供的在程序运行时获取对象声明类型的特性。
静态语言的特性是在程序编译前进行声明,这样程序在编译期就能很方便的获取变量的类型。动态语言提供了程序在运行时获取对象声明类型的特性,具有更好的扩展性,java是一门动态语言。
一个对象可以被理解为一个变量的实例。一个对象能够被加载的前提是有确定的声明,同时只要获取到对象就可以获取到确定的声明类型。所以,泛型编程必须满足以下两点:
1,程序必须在运行期能够得到确定的声明。
2,获取对象之后才可以获取到对象的声明类型。
下面给出三种声明方式,以及相对应的运行阶段获取对象类型的方法。The Code Shows Everything, Let's go~
第一类:简单声明
public class Bean<T> { T t; public T getT() {
return t;
} public void setT(T t) {
this.t = t;
} }
第二类:父类声明
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type; public class ExtendGeneral<T> { Class<T> t; public void aaa(){
Type superClassGenricType = getSuperClassGenricType(getClass(), 0);
System.out.println(getClass());
System.out.println(t);
t = (Class<T>) superClassGenricType;
System.out.println(t); } public static Type getSuperClassGenricType(Class clazz, int index) { //返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。
Type genType = clazz.getGenericSuperclass(); //返回表示此类型实际类型参数的 Type 对象的数组。
Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); return params[index];
} }
public class Test1 extends ExtendGeneral<String>{ }
第三类,接口声明
public interface InterGeneral<A, B> { <B> B aaa(A a);
}
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap; public class Test2 implements InterGeneral<String, HashMap>{ @Override
public HashMap aaa(String a) {
Type[] genericSuperclass = getClass().getGenericInterfaces();
ParameterizedType type = (ParameterizedType)genericSuperclass[0];
Type[] actualTypeArguments = type.getActualTypeArguments();
System.out.println(actualTypeArguments[0]);
System.out.println(actualTypeArguments[1]);
return null;
} }
main方法:
public class Main {
public static void main(String[] args) { System.out.println("简单声明泛型:");
Bean<String> b = new Bean<String>();
b.setT("333");
String t = b.getT();
System.out.println(t); System.out.println("继承声明泛型:");
Test1 t1 = new Test1();
t1.aaa(); System.out.println("接口声明泛型:");
Test2 t2 = new Test2();
t2.aaa(""); } }
输出结果:
简单声明泛型:
333
继承声明泛型:
class com.asiainfo.base.T.Test1
null
class java.lang.String
接口声明泛型:
class java.lang.String
class java.util.HashMap
Type类是一个接口,是所有Class的超类。
对java泛型的理解的更多相关文章
- java泛型的理解
总体介绍泛型: 1.泛型是计算机程序中一种重要的思维方式,它将数据结构和算法与数据类型相分离,使得同一套数据结构和算法,能够应用于各种数据类型,而且还可以保证类型安全,提高可读性.在Java中,泛型广 ...
- Java泛型深入理解(转载)
原文地址 http://blog.csdn.net/sunxianghuang/article/details/51982979 泛型之前 在面向对象编程语言中,多态算是一种泛化机制.例如,你可以将 ...
- Java:泛型的理解
本文源自参考<Think in Java>,多篇博文以及阅读源码的总结 前言 Java中的泛型每各人都在使用,但是它底层的实现方法是什么呢,为何要这样实现,这样实现的优缺点有哪些,怎么解决 ...
- 对于Java泛型的理解
源起:查看COLLECIOTNS类 Q1:为什么java需要泛型? 因为java对于对象类型的确认在编译期,那么强制类型转换就可以通过编译,但是运行时的错误却无法避免,那么泛型的存在可以避免强制类型转 ...
- Java泛型深入理解
泛型的优点: 泛型的主要优点就是让编译器保留參数的类型信息,执行类型检查,执行类型转换(casting)操作,编译器保证了这些类型转换(casting)的绝对无误. /******* 不使用泛型类型 ...
- 你对Java泛型的理解够深入吗?
泛型 泛型提供了一种将集合类型传达给编译器的方法,一旦编译器知道了集合元素的类型,编译器就可以对其类型进行检查,做类型约束. 在没有泛型之前: /** * 迭代 Collection ,注意 Coll ...
- Java泛型简单理解
优点1: 没有使用泛型,向list集合中添加非字符串,运行时会报错:类型不匹配 ObjectList.java: package cn.nxl2018; import java.util.ArrayL ...
- 关于Java泛型深入理解小总结
1.何为泛型 首先泛型的本质便是类型参数化,通俗的说就是用一个变量来表示类型,这个类型可以是String,Integer等等不确定,表明可接受的类型,原理类似如下代码 int pattern; //声 ...
- java 泛型的理解与应用
为什么使用泛型? 举个例子: public class GenericTest { public static void main(String[] args) { List list = new A ...
随机推荐
- Scrapy框架--使用cookie
CookieMiddleware class scrapy.downloadermiddlewares.cookies.CookieMiddlewar 该中间件使得爬取需要cookie(例如使用ses ...
- C#委托
关于什么是委托,委托如何使用,我在这里就不说了. 需要说的: 委托是函数指针链 委托的 BeginInvoke 委托如果出现异常,会如何 如果不知道函数指针,可以继续往下看,我来告诉大家,为何需要委托 ...
- Ubuntu15.04 网站服务器环境搭建,php/html/css等学习环境搭建教程
---恢复内容开始--- 本文部分参考自:http://www.cnblogs.com/emouse/archive/2013/06/07/3124009.html 原文中存在少量错误,已改正. 首先 ...
- UVa12100,Printer Queue
水题,1A过的 数据才100,o(n^3)都能过,感觉用优先队列来做挺麻烦的,直接暴力就可以了,模拟的队列,没用stl #include <iostream> #include <c ...
- 新建JSPWeb应用
首先,在eclipse Java EE里新建项目,选择Dynamic Web Project 目录如图所示,在WebContent里建立新文件JSP File. 先在body标签里写入hello wo ...
- svn的简介
Svn(Subversion)是近年来崛起的版本管理工具,在当前的开源项目里(J2EE),几乎95%以上的项目都用到了SVN.Subversion项目的初衷是为了替换当年开源社区最为流行的版本控制软件 ...
- ASP 文件内部访问数据库的通常途径
创建至数据库的 ADO 连接(ADO connection) 打开数据库连接 创建 ADO 记录集(ADO recordset) 打开记录集(recordset) 从数据集中提取你所需要的数据 关闭数 ...
- mysql 中翻页
万变不离其中 select * from tableName where 条件 limit 当前页码*页面容量-1 , 页面容量
- WinForm 菜单控件
一:MenuStrip 菜单条 MenuStrip 是应用程序菜单条的容器. 二:ToolStripMenuItem 像上面图中, 文件 格式 等这些菜单当中的一级菜单以及文件中的 新建 打开 分割条 ...
- C#第二篇——关于C#中的正则表达式
在C#中,正则表达式是用来进行查询在给出的一串字符中的某些字符或者数字的工具.与在办公软件中的查找功能相似,可以用精确查找也可以用模糊查找. 元字符: 元字符 说明 . 匹配除换行符以外的任意字符 \ ...