什么是泛型?
字面意思,泛型即为广泛的类型。
我们都知道,在实际的开发中,对于数据的一致性要求很高,泛型的好处就是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。
使用泛型的好处?
1、在没有泛型之前,从集合中读取到的每一个对象都必须进行类型转换,如果不小心插入了错误的类型对象,在运行时的转换处理就会出错。
2、使用泛型之后,相当于告诉编译器每个集合接收的对象类型是什么,编译器在编译期就会做类型检查,告知是否插入了错误类型的对象,使得程序更加安全,增强了程序的健壮性。
3、消除源代码中的许多强制类型转换,这增强了代码的可读性,并且减少了出错机会。
4、泛型变量固定了类型,使用的时候就已经知道是值类型还是引用类型,避免了不必要的装箱、拆箱操作。提高程序的性能
5、提高了代码的重用性
泛型的本质
泛型的本质是参数化类型:即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。泛型具有广泛性和普适性
泛型的应用
泛型可以分别在类、接口、和方法中使用。被称为泛型类,泛型接口,和泛型方法。
泛型方法:语法格式
public <无意义占位符> 返回值类型 方法名字(参数列表){
return 返回值;
}
此处的无意义占位符,要看这个方法的传参类型,传什么就是什么。需要注意的是泛型的方法,一定是带有参数的才有意义,返回值是和参数的T 数据类型要保持一致的。
class Dog {
public <T> void test (T t) {
System.out.println(t);
}
}
public class Demo3 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.test("大白花");
dog.test(89);
dog.test(90.8);
}
}
泛型类:语法格式
class 类名<无意义的占位符>{
}
注意:在带有泛型的类中,使用泛型方法,不需要在方法上加泛型标识,加了泛型标识,就不再受泛型类的类型约束。
带泛型的抽象类:语法格式
abstract class 类名<无意义的占位符>{
}
继承了泛型抽象类的普通类,必须是带有泛型的普通类
abstract class A<T> {
abstract void testA (T t);
}
//抽象类,暂时没有办法直接实例化,只能再写一个普通类去继承抽象类
//总结:继承了带有泛型的抽象类,那么继承类也需要有泛型!!!
class TestA<T> extends A<T> {
@Override
void testA(T t) {
System.out.println(t);
}
}
public class Demo1 {
public static void main(String[] args) {
//是int的包装类 就是代表的是int类型的数据
TestA<Integer> testA = new TestA<>();
testA.testA(89);
}
}
带有泛型的接口:语法格式
interface 接口名<无意义的占位符>{
}
实现带有泛型的接口的类,必须是带有泛型的类,否则编译报错
interface A<T>{
void name(T t);
}
class B<T> implements A<T>{
@Override
public void name(Object o) {
System.out.println(o);
}
}
public class T2 {
public static void main(String[] args) {
B<String> b = new B<>();
b.name("哈哈哈");
}
}