文章目录
一、泛型入门
- Java 集合有一个缺点:把对象放进集合之后,就会忘记这个对象的数据类型,再次取出时,该对象的编译类型就变成了 Object 类型;
1. 编译时不检查类型的异常
2. 使用泛型
- Java 引入了“参数化类型”的概念,允许程序在创建集合时指定集合元素的类型;
List<String> strList = new ArrayList<String>();
- 以上代码成功创建一个 String 类型的 List ,写作:List<String>,可以称 List 是带一个类型参数的泛型接口;
3. Java7 泛型的“菱形”语法
- Java 允许在构造器后不需要带完整的泛型信息,只要给出一对尖括号<>即可;被称为“菱形”语法;
List<String> strList = new ArrayList<>();
Map<String, Integer> scores = new Map<>();
二、深入泛型
- 泛型:就是允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态的指定;
1. 定义泛型接口、类
-
泛型的实质:允许在定义接口、类时声明类型形参,类型形参在整个接口、类体内可以当成类型使用,几乎所有可使用的普通类型的地方都可以使用这种类型形参;
-
可以为任何类、接口增加泛型声明;
-
泛型类:
public class GenericDemo<T> {
public static void main(String[] args) {
Student s = new Student();
s.setName("dd");
System.out.println(s.getName());
Teacher t = new Teacher();
t.setAge(20);
System.out.println(t.getAge());
System.out.println("------------");
//下面使用泛型
Generic<String> g1 = new Generic<String>();
g1.setT("dd");
System.out.println(g1.getT());
Generic<Integer> g2 = new Generic<Integer>();
g2.setT(20);
System.out.println(g2.getT());
}
}
- 泛型接口:
public interface Generic<T>{
void show(T t);
}
public class GenericImpl<T> implements Generic<T>{
public void show(T t){
System.out.println(t);
}
}
2. 从泛型类派生子类
- 当创建了带泛型声明的接口、父类之后,可以为该接口创建实现类,或从该父类派生子类;注意:当使用这些接口、父类时不能再包含类型形参;
- 下面语句的语法错误
public class A extends Apple<T>{ }
应修改为:
public class A extends Apple<String>
或者:
public class A extends Apple
3. 并不存在泛型类
- 系统中并不会真正生成泛型类;
三、类型通配符
1. 使用类型通配符
- 类型通配符:<?>
- List<?> :表示元素类型未知的 List,它的元素可以匹配任何类型;
- 注意:这种带通配符的 List 仅表示它是各种泛型 List 的父类,并不能把元素添加到其中;
2. 设定类型通配符的上限
-
如果我们只希望 List<?> 代表某一类泛型 List 的父类,可以使用类型通配符的上限:
①类型通配符上限:<? extends 类型>
② List<? extends Number>:它表示的类型是 Number或其子类型; -
还可以指定类型通配符的下限:
①类型通配符下限:<? super 类型>
② List<? super Number>:它表示的类型是 Number或其父类型;
3. 设定类型参数的上限
四、泛型方法
1. 定义泛型方法
//用泛型方法改进
public class Generic2{
public <T> void show(T t){
System.out.println(t);
}
}
public class GenericDemo2 {
public static void main(String[] args) {
Generic2 g = new Generic2();
g.show("dd");
g.show(20);
g.show(true);
}
}
2. 泛型方法和类型通配符的区别
- 大多数时候都可以使用泛型方法来代替类型通配符