泛型的运用:
需求:
定义一个方法,可以接受任意数据类型,而且要求返回的数据类型,就是你传入的数据类型
例如:
传入String,返回String
传入Demo3类型,返回Demo3类型
泛型:
占位符!!!<一个大写字母>,只是一个占位符,没有实际含义,而且不同地方定义的占位符没有联系
泛型在函数中使用的格式
修饰符 <声明的自定义泛型占位符> 返回值类型(可以使用自定泛型) 函数名(形式参数列表"也可以使用泛型") {
函数体
在函数体中,所有用到自定义泛型的地方,都可以被替换
}
包装类
Java是完全面向对象的语言,在Java中万物皆对象,如果是要保存类对象,那么8大基本数据类型就无法使用所以,Java提供了一个包装机制,包装基本数据类型,让他们变成类对象,
自动封箱
Integer -> int
Byte -> byte
Long -> long
Short -> short
Double -> double
Float -> float
Boolean -> boolean
Character -> char
如果使用包装类直接赋值给普通的基本数据类型,这个操作称之为 拆箱
在类内使用泛型
格式:
class 类名<自定义泛型的占位符> {
//在这里所用到的泛型和用户创建对象时声明的一致
}
注意事项:
1. 一个类声明的自定义泛型,如果在创建该类对象时,确定了泛型的具体数据类型,那么
在整个类内所有用到该泛型占位符的非静态成员方法,使用的数据类型都是创建时确定的类型
2. 如果创建使用了自定义泛型类对象,但是没有确定泛型的具体类型,那么编译器会把这个
泛型认为是Object类型
3. 类中声明的自定义泛型,不能对类内的静态方法使用,如果想让静态方法使用泛型, 自娱自乐
自己声明,自己使用,类似方法中使用泛型
4. 建议:如果在代码中出现了多个使用不同泛型的地方,请使用不同的名字 T E
在接口中定义泛型
格式 :
interface 接口名<自定义泛型的占位符> {
//成员变量 缺省属性:public static final 定义时必须初始化
//成员方法 缺省属性:abstract
}
两种【遵从】带有自定义泛型的接口方式:
1. 更加自由,需要使用的泛型类型,在创建对象时确定,类似ArrayList
2. 适合原本这个类就没有使用泛型的情况,例如:一个类遵从Comparable接口
事项compareTo方法,这里可以在【遵从】时,确定Comparable需要的泛型
具体数据类型,减少没有必要的强制类型转换
泛型的上下限
T 泛型的占位符
? 通配符
super: 调用父类方法的关键字
extends: 继承的关键字
需求:定义一个函数接受任意类型数值的集合,但是这个数据必须是数值类型
数值类型:Number 已知子类:Integer Short Long Double Float (包装类)
要求传入的对象是Number类对象或者其子类对象
Integer extends Number;
Float extends Number;
Double extends Number;
? extends Number;
这就是泛型的上限:
需求:定义一个函数能够传入一个任意类型的集合,但是要求集合里面保存的数据必须是Number类对象,或者其父类对象
泛型的下限
能够保存的数据是Number类对象本身或者其父类对象