泛型(润物细无声!)

泛型

泛型是 程序设计语言 的一种特性。允许程序员在 强类型(强类型指的是程序中表达的任何对象所从属的类型都必须能在编译时刻确定) 程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是 引用类型 ,是堆对象,主要是引入了类型参数这个概念。(百度)

为什么使用泛型

在实际开放中,对于数据类型一致化的要求是非常重要的!
例如:

ArrayList list = new ArrayList();

如果这里没有对可以保存到 ArrayList 中的数据类型进行约束,这里会导致一些因为数据类型一致化导致的问题:

1、代码中会出现没有必要的强制类型转换,浪费时间浪费效率;
2、后期操作 ArrayList 发现数据类型不一致,导致其他操作问题。

使用泛型约束之后:

ArrayList<String> list = new ArrayList();

< String > 就是泛型约束,要求当前 ArrayList 中能够保存的数据是 String 类型。

优点:
1、数据类型一致化;
2、避免了没有必要的强制类型转换;
3、错误前置,要求保存的数据一致化,避免了因数据类型不一致导致的问题;
4、操作统一化。

自定义泛型在方法中的应用

一个方法使用了自定义泛型,会使该方法变的非常自由!

格式:
权限修饰符 [ static ] < 自定义泛型无意义占位符 > 返回值类型 [ 可以使用自定义泛型 ] 方法名(必须有一个带有自定义泛型的参数){
方法体

带有自定义泛型的方法,是依赖于方法的参数来确定泛型的具体数据类型!!

在带有自定义泛型的方法,如果是独立存在的,一定要带有一个参数是自定义泛型!!

自定义泛型在类中的使用
格式
class 类名<自定义泛型无意义占位符>//类内的非静态成员变量和非静态成员方法可以使用类名声明的自定义泛型
}

带有自定义泛型的类
@Param<T> 自定义泛型占位符
class Test1<T> {
	该方法使用了在类名上声明的自定义泛型
	@param t 和类名一致的自定义泛型
	@return 和类名一致的自定义泛型
public T getType(T t) {
	return t;
	}

public void testArgs(T t) {
	System.out.println(t.getClass());
	}

	 /*
    为什么类内的静态成员方法不能使用和类名一致的自定义泛型???

    静态成员方法是在类文件加载阶段就已经在内存的数据区加载完毕!!!

    泛型的具体数据类型是在创建当前类对象时确定的!!!

    静态成员变量泛型对应的具体数据类型还没有确定,就已经被加载,无法运行!!!
    public static T testStatic(T t) {
        System.out.println(t);
    }
     public static <E> E testStatic(E e) {
        return e;
    }
    */
 
自定义泛型在类中使用的总结:
    1. 在类名之后使用自定义泛型占位符,声明当前类中带有泛型
    2. 类名声明的自定义泛型,是在创建当前类对象时确定泛型对应的具体数据类型是哪一个
        Test1<String> test1 = new Test1<>();
       在类中所有使用到和类名一致的泛型位置,都会被替换!!!

    3. 一个类带有自定义泛型,但是在创建当前类对象时没有约束泛型的具体数据类型,在类内
    所有使用到和类名一致的自定义泛型, 都会被Object替换!!!【不建议】
    4. 类名声明的自定义泛型不能用于静态成员方法,如果静态成员方法需要使用自定义泛型,
   
   public class Demo3 {
    public static void main(String[] args) {
        Test1<String> stringTest1 = new Test1<>();

        String type = stringTest1.getType("123");

        Test1<Demo1> demo1Test1 = new Test1<>();

        Demo1 type1 = demo1Test1.getType(new Demo1());
        demo1Test1.testArgs(new Demo1());

        Test1 test1 = new Test1();

        test1.getType(1);

    }
}
自定义泛型在接口中的使用
/*
格式
*/
interface 接口名<T> {
    // 有且只有成员方法可以使用自定义泛型
    /*
    接口中的成员变量缺省属性是public static final修饰
    final修饰的成员变量定义时必须初始化,但是T类型是泛型,无法确定数据类型,无法初始化
    */
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值