泛型的出现
在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
使用泛型的好处
泛型的好处是在编译的时候==检查类型安全==,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。
规则限制
- 泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
- 同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
- 泛型的类型参数可以有多个。
- 泛型的参数类型可以使用extends语句,例如
.习惯上称为“有界类型” - 泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(“java.lang.String”);
使用总结
1、==创建对象的时候要指定泛型的具体类型==
2、创建对象时可以不指定泛型的具体类型(和创建集合对象一眼)。默认是Object,例如我们使用集合存储元素的时候没有使用泛型就是那么参数的类型就是Object
3、类上面声明的泛型只能应用于==非静态成员函==数,如果静态函数需要使用泛型,那么
需要在函数上独立声明。
4、如果建立对象后指定了泛型的具体类型,那么该对象操作方法时,这些方法只能操作一种数据类型。
5、所以既可以在类上的泛型声明,也可以在同时在该类的方法中声明泛型。
泛型方法示例
泛型类
class Box<T> {
/**
* 对象方法可以直接使用类泛型参数
* @param age
* @return
*/
public T getAge(T age){
return age;
}
/**
* 类方法需要使用<T>定义泛型参数
* @param name
* @param <T>
* @return
*/
public static <T> T getNameTest(T name){
return name;
}
}
泛型与泛型类类似。
public interface Inte<T> {
void show(T t);
}
public class InteIml<T> implements Inte<T> {
@Override
public void show(T t) {
}
}