谈谈我眼中的泛型

2024-03-15 06:08
文章标签 泛型 谈谈 眼中

本文主要是介绍谈谈我眼中的泛型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

           很早的时候我就接触了泛型,但是那个时候并不了解泛型有什么好处,在抽象的过程中使用泛型,后来接触到了gxpt系统,这个系统框架中,用的是泛型方法.那个时候只是知道这么用,说是可以解决重复写代码的问题,但是我并没有体会到,后来接触了Itoo 这个框架,这个里面用的是泛型类,同时我正在的参与到这个系统中,在跟gxpt相比,我体会到了使用泛型的好处.

一.介绍

         泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。


二.解决问题

         在JDK1.5 还没有泛型的时候,通过使用类型Object的来实现参数的”任意化”.实现参数任意化需要对显式进行强制类型转换.而且这种强制转换要求开发者对实际参数类型是预知的.对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个很大的安全隐患.如果使用泛型,就可以在编译阶段就发现这个错误,并且所有的强制转换都是自动和隐式的,再一次提高了代码的复用率.总结一句话就是泛型解决抽象过程中需要显式强制转换的问题,把主动变成被动,再次提高代码的复用率.

 

三.实例

无泛型,使用Object+强制转换实现抽象:

<span style="font-size:18px;">/*** 使用Object 类型,显示需要强制转换* @author huan**/
public class NoGen {private Object ob; //定义泛型成员变量public NoGen(Object ob){this.ob=ob;}public Object Getob(){return ob;}public void setOb(Object ob){this.ob=ob;}public void showType(){System.out.println("T的实际类型是:" +ob.getClass().getName());}
}public class GenDemo2 {public static void main(String[] args) {//定义泛型类NoGen 的一个Integer版本NoGen intOb=new NoGen(new Integer(88));intOb.showType();int i=(int) intOb.Getob();System.out.println("Value="+i);System.out.println("------------------");//定义泛型类Gen的一个String版本NoGen strOb=new NoGen("Hello Gen!");strOb.showType();String s=(String) strOb.Getob();System.out.println("value="+s);}
}
</span>

对应类图:



使用泛型实现抽象:


<span style="font-size:18px;">public class Gen<T> {private T ob; //定义泛型成员变量public Gen(T ob){this.ob=ob;}public T Getob(){return ob;}public void setOb(T ob){this.ob=ob;}public void showType(){System.out.println("T的实际类型是:" +ob.getClass().getName());}
}/*** 使用泛型* @author huan**/
public class GenDemo {public static void main(String[] args) {//定义泛型类Gen 的一个Integer版本Gen<Integer> intOb=new Gen<Integer>(88);intOb.showType();int i=intOb.Getob();System.out.println("Value="+i);System.out.println("------------------");//定义泛型类Gen的一个String版本Gen<String> strOb=new Gen<String>("Hello Gen!");strOb.showType();String s=strOb.Getob();System.out.println("value="+s);}
}
</span>

对应类图:


从两张类图可以看出,Object+强制转换实现的抽象是被动的,使用泛型事项的抽象是主动的.使用主动替换被动,让封装的代码侵入性更小.


四.泛型类与泛型方法的区别

从作用域来说,泛型类的作用域要比泛型方法要小一些.使用泛型类所受到的限制要大一些.

从加载的情况来看,泛型类推迟了加载时间,属于懒加载.

 

五.总结

1.使用泛型,泛型的中的参数是地址传值还是按值传递.

 答案:是地址传值

2.从复用性的角度来说,泛型类和泛型方法那个更好.gxpt运用的是泛型方法,itoo使用的泛型类.itoo使用泛型类是为了把底层进行进一步的封装.提高代码的复用率.

3.使用集合的时候都会用上泛型,那么容器是集合+方法,在容器中,泛型也是常用的。所以学习容器的时候,应该先理解泛型的思想.



这篇关于谈谈我眼中的泛型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/811028

相关文章

Java泛型类型解析

解析泛型类型 获取字段泛型类型 **java.lang.reflect.Field#getGenericType**: 作用:返回字段的泛型类型。返回类型:Type。如果字段是一个泛型类型,这个方法将返回一个表示这个泛型类型的 Type 对象,比如 ParameterizedType,TypeVariable 等等。如果字段不是泛型类型,这个方法将返回字段的具体类型,即 Class 对象。示例

【数据结构】--初识泛型

1. 包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。 1.1 基本数据类型和对应的包装类 除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。 1.2 (自动)装箱和(自动)拆箱 装箱(装包): 把 基本数据类型 变为 包装类类型 的过程 叫做装箱。 反汇编指

泛型参Class、Class、Class的对比区别

1.原文链接 泛型参Class、Class、Class的对比区别 https://blog.csdn.net/jitianxia68/article/details/73610606 <? extends T>和<? super T> https://www.cnblogs.com/drizzlewithwind/p/6100164.html   2.具体内容: 泛型参数Class、

Java|泛型的使用

文章目录 概述泛型的基本概念泛型类示例 泛型方法示例 泛型接口示例 泛型的类型参数约束示例 通配符(Wildcard)上界通配符(`? extends T`)下界通配符(`? super T`) 泛型的类型擦除类型擦除的影响 泛型中的常见限制泛型的优点 总结 概述 泛型(Generic)是 Java 5 引入的一项特性,它允许类、接口和方法可以处理任何类型的数据,而不必指定具体

hibernate泛型Dao,让持久层简洁起来

【前言】hibernate作为持久层ORM技术,它对JDBC进行非常轻量级对象封装,使得我们可以随心所欲的使用面向对象的思想来操作数据库。同时,作为后台开发的支撑,的确扮演了一个举足轻重的角色,那么我们在项目中如何灵活应用hibernate,也会给项目维护以及项目开发带来便利,下面我将展示我们项目中是如何来对hibernate进行应用和操作。 【目录】              -

dart 中的 泛型 怎么写??

import 'package:flutterdemo/bean/MyUser.dart';class BaseResp<T> {int code;String str;T data;BaseResp({this.code, this.str, this.data});BaseResp.fromJson(Map<String, dynamic> jsonStr) {code = jsonStr['

泛型第四课,自定义实现迭代器、深入迭代器、迭代器原理,面向对象

package com.pkushutong.genericity4;import java.util.Iterator;/*** 简化迭代器原理* @author dell**/public class Array2 implements java.lang.Iterable<String>{private String[] elem = {"a","b","c","d","e","f","g

泛型第三课,自定义泛型、无多态、通配符、无泛型数组

泛型没有多态 package com.pkushutong.genericity4;/*** 多态的两种形式* 注:泛型没有多态* @author dell**/public class Test01 {public static void main(String[] args) {Fruit f = new Fruit();test(new Apple());}//形参使用多态publi

泛型第二课,派生子类、属性类型、方法重写、泛型擦除

子类(实现类) 子类与父类|接口一样使用泛型子类指定具体的类型子类与父类|接口 同时擦除类型子类泛型,父类|接口 擦除错误:不能子类擦除,父类|接口泛型 package com.pkushutong.genericity3;/*** 父类为泛型类* 1、属性* 2、方法* * 要么同时擦除,要么子类大于等于父类的类型* 不能子类擦除,父类泛型* 1、属性类型* 父类中,随父类型定

谈谈我的8年编程自学辛酸史

2008年:第一个脚印 2008年的一个周末,我一如既往读着最爱的《电脑迷》和《电脑爱好者》,不经意间看见一篇文章,教读者如何自己制作一个exe来说生日快乐,于是,或许是我一生的道路就从这里开始了。 当时已经痴迷于电脑软件,但是身为初中生的我并没有机会玩电脑,只能苦苦地看着杂志记录好玩的软件,并没有想过真的要自己去制作软件。直到去新华书店买辅导书的一次契机,我看见了一本《Java语言教程》