正确的应用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泛型的理解的更多相关文章

  1. java泛型的理解

    总体介绍泛型: 1.泛型是计算机程序中一种重要的思维方式,它将数据结构和算法与数据类型相分离,使得同一套数据结构和算法,能够应用于各种数据类型,而且还可以保证类型安全,提高可读性.在Java中,泛型广 ...

  2. Java泛型深入理解(转载)

    原文地址  http://blog.csdn.net/sunxianghuang/article/details/51982979 泛型之前 在面向对象编程语言中,多态算是一种泛化机制.例如,你可以将 ...

  3. Java:泛型的理解

    本文源自参考<Think in Java>,多篇博文以及阅读源码的总结 前言 Java中的泛型每各人都在使用,但是它底层的实现方法是什么呢,为何要这样实现,这样实现的优缺点有哪些,怎么解决 ...

  4. 对于Java泛型的理解

    源起:查看COLLECIOTNS类 Q1:为什么java需要泛型? 因为java对于对象类型的确认在编译期,那么强制类型转换就可以通过编译,但是运行时的错误却无法避免,那么泛型的存在可以避免强制类型转 ...

  5. Java泛型深入理解

    泛型的优点: 泛型的主要优点就是让编译器保留參数的类型信息,执行类型检查,执行类型转换(casting)操作,编译器保证了这些类型转换(casting)的绝对无误. /******* 不使用泛型类型 ...

  6. 你对Java泛型的理解够深入吗?

    泛型 泛型提供了一种将集合类型传达给编译器的方法,一旦编译器知道了集合元素的类型,编译器就可以对其类型进行检查,做类型约束. 在没有泛型之前: /** * 迭代 Collection ,注意 Coll ...

  7. Java泛型简单理解

    优点1: 没有使用泛型,向list集合中添加非字符串,运行时会报错:类型不匹配 ObjectList.java: package cn.nxl2018; import java.util.ArrayL ...

  8. 关于Java泛型深入理解小总结

    1.何为泛型 首先泛型的本质便是类型参数化,通俗的说就是用一个变量来表示类型,这个类型可以是String,Integer等等不确定,表明可接受的类型,原理类似如下代码 int pattern; //声 ...

  9. java 泛型的理解与应用

    为什么使用泛型? 举个例子: public class GenericTest { public static void main(String[] args) { List list = new A ...

随机推荐

  1. 【特效】jquery选项卡插件,页面多个选项卡统一调用

    把选项卡整合了一下,写成个插件,这样可以整个站,或整个页面有多个选项卡时,统一调用.代码的具体注意事项已经写进注释了.用于js获取元素的class名称必须有,选项卡本身的样式,另再取一个名字来设置(本 ...

  2. JavaScript观察者模式

    观察者模式观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得 ...

  3. Android基础知识02—安卓日志工具LogCat的五种方法

    --------Android 02-------- >>> Android的日志工具LogCat    五个方法,记录信息的级别不一样,从低到高为:    1.Log.v()-日志 ...

  4. Volley图片加载并加入缓存处理(转自http://blog.csdn.net/viewhandkownhealth/article/details/50957024)

    直接上代码  两种方式 ImageView 和NetworkImageView 如有问题或者好的建议.意见 欢迎大家加入技术群(群号: 387648673 ) 先自定义全局Application 获取 ...

  5. Junit基本使用

    Junit基本用法 1.创建Junit Test Case 2.基本使用(以oracle数据库操作为例) package com.csit.adminsystem1.tests; import sta ...

  6. canvas绘制太阳系

    原文地址:http://jeffzhong.space/2017/10/26/solar/ 学习canvas有一段时间了,顺便写个小项目练手,该项目用到的知识点包括: ES6面向对象 基本的三角函数 ...

  7. yii2之DetailView小部件

    DetailView小部件用于展示单条数据记录,可配置属性很少,使用也很简单,直接贴代码,一看就懂! yii小部件数据小部件DetailView的使用示例: <?= DetailView::wi ...

  8. vue数据请求

    我是vue菜鸟,第一次用vue做项目,写一些自己的理解,可能有些不正确,欢迎纠正. vue开发环境要配置本地代理服务.把config文件加下的index.js里的dev添加一些内容, dev: { e ...

  9. java对象类型转换和多态性

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  10. 使用SQL语句时应该注意的一些问题

    DECLARE @Where NVARCHAR(max); SET @Where=''; --初始查询条件 SET @Where+=' '; 1.当要对变量使用 "+="时,需要先 ...