黑马学习笔记--泛型
来源:互联网 发布:索多玛120天 知乎 编辑:程序博客网 时间:2024/06/11 12:30
泛型
泛型定义与使用
- A:泛型用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数传递。
- B:泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型
ArrayList<String> al=new ArrayList<String>();//ArrayList<String>看作数据类型
- C:泛型的定义:定义泛型可以在类中预支地使用未知的类型。
//在ArrayList类的add()方法的源码中定义的E e,使用了epublic boolean add(E e) { ensureCapacityInternal(size + 1); elementData[size++] = e; return true; }
- D:泛型的使用:一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
ArrayList al=new ArrayList(); al.add(“abc”); al.add(1);//由于在定义集合时没有指定泛型,add()方法的形参为Object类型,所以可以往集合中添加任意任意类型的数据(多态特点)
泛型类
格式:
当创建该类的对象的时候,传入类型,此时类上的泛型被确定
class 类名<E,T,……>{//<>中的泛型可以写无数个 //E,T……能够做为类型在该类内部被使用}
案例代码:
/* * 在该类中定义一个成员变量,使用泛型 * * 不指定其数据类型,是一个不确定的数据类型. * 创建不同的对象时,指定不同的数据类型 * */public class MyClass4Type<T> { private T myField; public T getMyField() { return myField; } public void setMyField(T myField) { this.myField = myField; }}
/* * 泛型类: * 在类中使用泛型 * * 定义:类名后<变量> 如:class A<E> {使用E完全类的定义} * 使用:创建对象时确定类型 * * 一般定义泛型使用E,T,V,K * * 泛型方法: * 定义:方法返回值前<变量> 如:public <T> void method(){使用T} * 使用:调用方法时确定类型 */public class Demo01type_class { public static void main(String[] args) { //测试使用自己定义的泛型类 MyClass4Type<String> mc4t = new MyClass4Type<String>(); //调用了使用类泛型的方法 mc4t.setMyField("Jack"); String myField = mc4t.getMyField(); System.out.println(myField); //创建对象时指定泛型为Integer则所有使用了泛型的方法根据对象类型一起改变 MyClass4Type<Integer> mc4t2 = new MyClass4Type<Integer>(); mc4t2.setMyField(12); System.out.println(mc4t2.getMyField()); }}
泛型方法
格式
在调用泛型方法,并且传入实参的时候才能确定方法上形参的类型
修饰符 <T,Q,E……> 返回值类型 方法名(T t,Q q,……){//方法上的泛型定义在返回值的前面}
案例代码
/* * 在该类中定义一个成员变量,使用泛型 * * 不指定其数据类型,是一个不确定的数据类型. * 创建不同的对象时,指定不同的数据类型 * */public class MyClass4Type<T> { //定义泛型方法 public <T2> void method(T2 t) { System.out.println(t); }}/* * 泛型类: * 在类中使用泛型 * * 定义:类名后<变量> 如:class A<E> {使用E完全类的定义} * 使用:创建对象时确定类型 * * 一般定义泛型使用E,T,V,K * * 泛型方法: * 定义:方法返回值前<变量> 如:public <T> void method(){使用T} * 使用:调用方法时确定类型 */public class Demo01type_class { public static void main(String[] args) { //测试使用自己定义的泛型类 MyClass4Type<String> mc4t = new MyClass4Type<String>(); //调用泛型方法,是在调用方法时确定的数据类型 mc4t.method("abc"); mc4t.method(12); }}
泛型接口
格式一:
interface 接口名<Q,E,R……>{public abstract void method(T t);//假设定义一个方法}class 类名 implements 接口<实际类型>{ @Override public void method(String t) { System.out.println(t);}}
格式二:
interface 接口名<Q,E,R……>{ public abstract void method(T t);//假设定义一个方法}public class MyClass24Inter<T> implements MyInter4Type<T>{ //由于没有指定接口中具体的数据类型,所以方法中仍然使用这种不确定的数据类型 @Override public void method(T t) { }}
泛型通配符
泛型通配符:?定义:(查看ArrayList的构造方法)无法在类中使用使用:调用方法时可以给予任意类型。参照Arraylist的构造方法? extends E代表只要是E类型的子类即可? super E代表只要是E类型的父类即可
import java.util.ArrayList;/* * 泛型通配符?,代表任意的数据类型 * * 定义:(查看ArrayList的构造方法)无法在类中使用 * * 使用:调用方法时可以给予任意类型。参照Arraylist的构造方法 * public ArrayList(Collection<? extends E> c) * 为了便于?的理解,我们将以上方法重写为public ArrayList(ArrayList<? extends E> c) * * 该方法的意思:创建集合对象A时,给于另外一个集合对象B作为参数,则创建好的集合A中包含了集合B中的元素 * * ? extends E代表只要是E类型的子类即可 * ? super E代表只要是E类型的父类即可 */public class Demo01 { public static void main(String[] args) { //定义集合b,包含3个元素 ArrayList<String> listB = new ArrayList<String>(); listB.add("Jack"); listB.add("Rose"); listB.add("Trump"); //使用集合b创建集合a ArrayList<Object> listA = new ArrayList<Object>(listB); listA.add("Obama"); //观察集合A System.out.println(listA); }}
泛型优点:
- 提高程序的安全性
- 将运行期问题转移到了编译期
- 省去了类型强转的麻烦
0 0
- 黑马学习笔记--泛型
- 黑马程序员.net学习笔记3----泛型。
- 黑马程序员-java学习笔记-泛型
- 黑马程序员---学习笔记
- 黑马程序员----学习笔记
- 黑马程序员----学习笔记
- 黑马程序员---学习笔记
- java学习笔记-黑马
- 黑马学习笔记1
- 黑马学习笔记5
- 黑马学习笔记10
- 黑马学习笔记
- 黑马学习笔记1
- 黑马学习笔记2
- 黑马学习笔记3
- 黑马学习笔记4
- 黑马学习笔记5
- 黑马学习笔记6
- SQL Server 基础之表、临时表、表变量
- MyBatis学习之入门篇(一)
- 黑马学习笔记--双例集合(Map)
- xshell连接本地linux,可以ping通
- linux下gdb调试
- 黑马学习笔记--泛型
- TCON控制字及TMOD寄存器
- (CF792 ABCD题解) 模拟,树状数组
- C# winform制作不规则窗体
- 网页框架
- rman备份文件格式
- 中断
- spring 配置文件属性命名注意点
- TXT数据转OpenCV中的Mat数据