1. 认识泛型
-
定义类、接口、方法时,同时声明了一个或者多个类型变量(如:),称为泛型类、泛型接口、泛型方法,它们统称为泛型。
-
作用:泛型提供了在编译阶段约束所能操作的是数据类型,并自动进行检查的能力。这样可以避免强制类型转换,及其他可能出现的异常。
-
注意:类型变量建议用大写的字母,常用的有:E(元素类型)、T(返回值类型)、K(键类型)、V(值类型)等
2. 泛型类
-
语法规范
修饰符 class 类名<类型变量, 类型变量, ...>{ ... } //示例 public class ArrayList<E>{ ... }
-
自定义泛型类
//自定义MyArrayList,为了简化操作套用一下ArrayList public class MyArrayList<E> { private ArrayList list = new ArrayList(); public boolean add(E e){ list.add(e); return true; } pulbic boolean remove(E e){ return list.remove(e); } } //模拟MyArrayList集合自定义一个集合MyArrayList MyArrayList<String> list = new MyArrayList<String>(); //从Jdk1.7开始支持以下简化操作 MyArrayList<String> list = new MyArrayList<>(); list.add("hello"); list.remove("hello");
3. 泛型接口
-
语法规范
修饰符 interface 接口名<类型变量, 类型变量, ...>{ ... } //示例 public interface A<E>{ ... }
-
自定义泛型接口
public interface Data<T>{ void add(T t); void update(T t); T query(int id); } //应用实例,比如StudentsData和TeachaersData都要完成Data的工作 public class StudentsData implements Data<Student>{ ... } public class TeachersData implements Data<Teacher>{ ... }
4. 型方法
-
语法规范
修饰符<类型变量, 类型变量, ...> 返回值类型 方法名(形参列表){ ... } //示例 public static <T> void test(T t){ ... }
-
通配符
- 为了增强泛型的灵活性,加入通配符
- **概念:**就是"?",可以在”使用泛型“的时候代表一切类型;E T K V 是在定义泛型的时候使用
-
上下限
-
泛型上限:
? extends Car
: ? 能接收的必须是Car或者其子类 -
泛型下限:
? super Car
:? 能接受的必须是Car或者其父类 -
应用示例
public static void test(E e){ ... } //这里如果采用E e的形式,就无法接收到形参Arraylist<>了; //所以要改成以下形式 public static void test(ArrayList<?> cars){ ... } //这里没有设置上下限就是可以接收任何的ArrayList<>了,指向性不明确;所以要改成以下的 public static void test(ArrayList<? extends Car> cars){ ... }
-
5. 泛型支持的类型
-
泛型不支持基本数据类型,只能支持对象类型(引用数据类型)
- 为什么呢?泛型工作在编译阶段,等编译后泛型就没用了,所以泛型在编译后都会被擦除,用Object替换,所以这边如果是基本类型的话会产生
Object object = 基本类型
的问题。
- 为什么呢?泛型工作在编译阶段,等编译后泛型就没用了,所以泛型在编译后都会被擦除,用Object替换,所以这边如果是基本类型的话会产生
-
包装类
-
包装类就是把基本类型的数据包装成对象的类型
基本数据类型 对应的包装类(引用数据类新) byte Byte short Short int Integer long Long char Character float Float double Double boolean Boolean -
基本类型的数据包装成对象的方案
public Integer(int value)
- 使用示例:
Integer i = new Integer(100);
- 使用示例:
public static Integer valueOf(int i)
- 使用示例:
Integer i = Integer.valueOf(100;
- 使用示例:
-
自动装箱:基本数据类型可以自动转换为包装类
- 示例:
Integer i = 100;
- 示例:
-
自动拆箱:包装类型可以自动转换为基本类型
- 示例:
int j = i;
- 示例:
-
其他功能
-
可以把基本类型的数据转换成字符串类型
-
public static String toString(int i)
-
public String toString()
-
示例
int i=1; String res1 = Integer.toString(i); Integer j=i; String res2 = j.toString();
-
-
可以把字符串类型的数值转换成数值本身对应的真实数据类型
-
public static int parseInt(String s)
-
public static Integer valueOf(String s)
-
示例
String str = "99"; int i = Integer.valueOf(str); int j = Integer.parseInt(str);
-
特别说明:parseInt可以完成转十进制操作
String Number = "110" int num = Integer.parseInt(number, 2); System.out.println(num);//输出6
-
-
-