泛型学习笔记

泛型

什么是泛型?

​ 泛型广泛的,普通的类型,泛型能够帮助我们把类型明确的工作推迟到创建对象或者调用方法的时候。

意思就是:我定义类的时候,不需要考虑这个数组到底要存什么类型。
创建这个超级数组对象的时候把里面的数据的类型确定下来。

泛型的修饰:

​ 1.泛型类
2.泛型方法
3.泛型接口

泛型类:把泛型定义在类上,用户在使用类的时候,才能把类型确定。
具体的使用方法使用<>加上一个未知数,通常用T K V等大写字母表示
实际上用啥都行,只要是一个单词就可以。
当我们在一个类后面加上了一个泛型< T >,这个T就是一个数据类型。

​ 既然T就是一个数据类型,那我们就可以拿过来用
如果一个泛型类,在创建对象的时候没有指定类型,默认就是Object
在使用这个类的时候,去确定泛型类型
,在JDK7以后,可以省略等号右边的泛型的声明,<>必须要写,规范
类型推断

Ch02<String> ch02=new Ch02<>();

泛型方法

泛型方法:

我们如果只关心方法,我们可以不定义泛型类。
只定义泛型方法。

泛型方法是不是一定在泛型类中?不是
泛型类中是不是一定要有泛型方法?不是

在定义泛型方法时,要首先定义泛型类型。
定义在方法中间,泛型的使用处之前

使用泛型方法,最好要结合返回值,和Object一样

要知道到底什么样的方法是泛型方法。

public <T> T show(T t){
    //拿着这个t在方法中做事情,再把t返回回去
    System.out.println(t);
    return t;
}
  
public static void main(String[] args) {
    new Ch03().show(123);//调用方法的时候就直接定义了类型
}

继承关系

泛型在继承时:

  1. 父类是一个泛型类,子类要不要是泛型类?随意

  2. 永远记住泛型的声明只能在当前类名后或者方法中间,而且声明的泛型就是自己的

  3. 在子类继承父类时,子类泛型和父类泛型都写出来的情况下,是父跟子

  4. 如果在继承时,没有写出任何泛型,当前子类就不是泛型类。

如果在一个泛型类中,尽量不要使用泛型方法
泛型方法多数都是出现在非泛型类。

静态泛型方法

1.静态方法如果时泛型方法,泛型的声明必须写。

2.因为静态结构式属于类的,不属于某个对象。

通配符

“?” 通配符
可以接收任何类型。<?>等同于Object

如果使用Object类型,别写泛型
泛型约束类的数据类型。

类型参数化

类型参数化。

类型擦除
为了兼容性,使用原始类型(没有泛型),是可以的。

在泛型刚刚出现的时候,还存在着大量的不适用泛型的代码。

保证代码的兼容性,将参数化类型的实例传递给设计用于原始类型的方法必须
为了保持兼容性,java泛型中,其实有一种伪泛型,因为java在编译期间所有的泛型都会被擦掉

java的泛型语法是在编译器这个维度上实现的
正常来说在生成的字节码文件中,不包含泛型的类型信息的。

在jvm中看到的知识superArray,由泛型附加的类型信息对jvm是看不到的
可以理解为,泛型的本质就是让程序员在编写代码时遵守的规则

比如SuperArray:在确定了泛型之后,这个超级数组中统一只放同一类型的

如果放入其他类型,编译不通过

经验:开发中,能够在业务上解决的问题,尽量不要在技术上解决。

1.泛型不能是基本数据类型(原则上来说,数组可以作为泛型,语法角度,
< >里面放的就应该是类名,数组是在编译后才会生成一个类($xxx)

2.方法重载:

​ 1.同一个类,2.方法名相同,3.参数不同
原理:类型擦除。

3.多态

泛型的应用场景

泛型的应用场景:

1.父类(接口中),起到的是一个规范的作用,对里面的数据类型没有明确的要求

2.容器类:(超级数组,链表,队列,栈)

当类型无法确定时,使用泛型。

开发总,我们更多的时会使用到一些泛型类或泛型接口。

我们之前写过的数组链表,队列,栈
他们4个有一个共同的泛型接口,这4个结构都实现这个泛型接口,重写里面的泛型方法
设计的就是一个工具类。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值