泛型机制:是一种把类型明确的工作,推迟到创建对象,或者调用方法的时候才去明确的特殊的类型
泛型的格式
<数据类型> 这里的数据类型只能是引用数据类型
泛型好处
* 把运行时期的问题提前到了编译期间
* 避免了强制类型转换
* 优化了程序设计,解决了黄色警告线
注意:泛型只在编译期有效 但在运行期就擦除了
泛型类的概述及使用
* 泛型类概述: 把泛型定义在类上
* 定义格式: public class 类名<泛型类型1,…>
* 注意事项: 泛型类型必须是引用类型
例子
public class MyClass<T> { //泛型<T>
T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
public class MyTest2 {
public static void main(String[] args) {
把类型明确工作,推迟到创建对象,或调用方法时,才去明确的一种机制
MyClass<String> stringMyClass = new MyClass<>();
stringMyClass.setT("abc");
String t = stringMyClass.getT();
MyClass<Integer> integerMyClass = new MyClass<>();
integerMyClass.setT(100);
Integer t1 = integerMyClass.getT();
}
}
集合框架(泛型方法的概述和使用)
* 泛型方法概述: 把泛型定义在方法上
* 定义格式: public <泛型返回类型> 方法名(泛型类型 变量名)
集合框架(泛型接口的概述和使用)
* 泛型接口概述: 把泛型定义在接口上
* 定义格式: public interface 接口名<泛型类型>
例子
public interface MyInterface<T,U,R> { //泛型接口
public R show(T t,U u);
}
public class MyDemo2<T, U, R> implements MyInterface<T, U, R>{
@Override
public R show(T t, U u) {
return null;
}
}
public class MyTest3 {
public static void main(String[] args) {
//接口上的泛型,在你创建该接口的子类对象时,必须要明确这个泛型,具体是什么数据类型
MyDemo2<Integer, String, String> integerStringStringMyDemo2 = new MyDemo2<>();
Collection<Integer> collection=new ArrayList<Integer>();
//匿名内部类 在创建接口的子类对象时,就必须明确接口上的泛型,到底是什么类型
new MyInterface<String,String,String>(){
@Override
public String show(String s, String s2) {
return null;
}
};
}
}
1.10 增强for的概述和使用
增强for概述
简化数组和Collection集合的遍历
格式
for(元素数据类型 变量 : 数组或者Collection集合) {
使用变量即可,该变量就是元素
}
遍历
编写程序,将自定义对象存储到ArrayList集合,使用泛型并遍历
a) 使用迭代器遍历
b) 使用列表迭代器遍历
c) 使用size()和get()方法遍历
d) 使用增强for遍历
public class learn1 {
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("啊哈",4));
students.add(new Student("嗯哼",8));
students.add