泛型
泛型(给程序带来简洁性和健壮性)
一、泛型的概述
泛型大多数都在集合中使用,Java7开始,使用泛型的菱形语法:Java允许在构造器后不需要带完整的泛型信息,只要给出一对尖括号(<>)即可,Java可以推断尖括号里应该是什么泛型信息。
例如:List books = new ArrayList<>();
泛型的实质:允许在定义接口、类时声明类型形参,类型形参在整个接口、类体内可当成类型使用,几乎所有可使用普通类型的地方都可以使用这种类型形参。
泛型的应用: 程序只定义了一个List接口,但实际使用时可以产生无数个List接口,只要为E传入不同的类型实参,系统就多出一个新的List子接口。必须指出:List绝不会被替换成ListString,系统没有进行源代码赋值,二进制代码中没有,磁盘中没有,内存中也没有。
泛型的好处:
1. 解决元素存储的安全性问题
2.解决获取数据元素时,需要类型强转的问题
注意:
1.包含泛型声明的类型可以在类型变量、创建对象时传入一个类型实参,从而可以动态的生成无数多个逻辑上的子类,但这种子类在物理并不存在。
2.当创建带泛型声明的自定义类,为该类定义构造器时,构造器名还是原来的类名,不要增加泛型声明。
二、泛型类和泛型接口
1.泛型类
格式:class 类名{
…
}
如何指明父类的泛型类型
1.当子类继承父类时,可以直接指明父类的泛型类型,那么子类就不用再声明
public class Women extends Creature {}
2.由于系统中并不会真正生成泛型类,所以instanceof运算符后不能使用泛型类
public class Women extends Creature { }
2.泛型接口
interface 接口名{
…
}
三、泛型方法
泛型方法(写在返回值的前面)
在定义类、接口时可以使用类型形参,在该类的方法定义和成员变量定义、接口的方法定义中,这些类型形参可被当成普通类型来用。Java5开始提供对泛型方法的支持。
泛型方法的格式:(不受类类型形参的影响)
修饰符<T,S>返回值 方法名(形参列表){
方法体...
}
public E getE(E e){
…
}
泛型方法和类型通配符的区别
大多时候泛型方法可以代替类型通配符,类型通配符增加了程序的灵活性
类型通配符既可以在方法签名中定义形参的类型,也可以用于定义变量的类型;但泛型方法中类型形参必须在对应方法中显示声明
泛型方法可以使用static修饰,而泛型类里的普通方法不可以
java不支持泛型数组
四、类型通配符
语法:<?>
通配符的限制:
List<? extends Number>:泛型的类型只能是Number和Number的子类
List<> super Number>:泛型的类型只能是Number和Number的父类。
<?extends Comparable>:只允许泛型为实现Comparable接口的实现类的引用
五、泛型的常用应用方式(DAO)
[DAO类]
public class DAO<T> {
private Object[] obj = new Object[100];
private int total = 0;
public void add(T t) { obj[total++] = t; }
public void delete(T t) { }
public void update(T t) { }
}
[Woman类]
public class Woman extends DAO<Woman>{
public Woman(){ }
}
[Employee类]
public class Employee extends DAO<Employee>{
public Employee(){ }
}
[DAOTest类]
import org.junit.Test;
public class DAOTest {
@Test
public void test(){
//通过泛型,可以达到多个操纵一个的效果
Employee employee = new Employee();
Woman woman = new Woman();
employee.add(new Employee());
woman.add(new Woman());
}
}
上一篇: js生成对象,构造函数生成对象原理
下一篇: 泛型