什么是泛型???
此刻一脸懵逼的我,立即开始了百度.搜到的结果是,泛型的实质就是参数化类型?????,WO CAO (大写的) ,这又是什么鬼,说实话我是懵逼的.'
泛型 :其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法
也就是说,泛型就是将操作的数据类型参数化,这个时候将泛型用在类中是泛型类,用在方法中是泛型方法,用在接口中就是泛型接口
1. 泛型类 泛型方法
package com.wu.demo.fx;
/**
* 作者:吴奎庆
* <p>
* 时间:11/26/22
* <p>
* 用途: 泛型类 泛型用<>包裹 可以定义多个泛型 T W 就是泛型类型
*/
public class Person<T,W> {
T name;
W age;
// 泛型方法 普通泛型方法的占位符声明需要再类上边声明 可以声明多个占位符
public T getName() {
return name;
}
public void setName(T name) {
this.name = name;
}
public W getAge() {
return age;
}
public void setAge(W age) {
this.age = age;
}
//泛型静态方法, 泛型静态方法中的泛型占位符和 普通方法的占位符没关系
public static <D> void setSex(D sex){
System.out.println("性别:"+sex);
}
// <N> 是泛型占位符 N 是返回类型 (N sex) 是传递方法
public static <N> N getSex(N sex){
return sex;
}
@Override
public String toString() {
return "Person{" +
"name=" + name +
", age=" + age +
'}';
}
}
2. 泛型接口
/**
* 作者:吴奎庆
* <p>
* 时间:11/26/22
* <p>
* 用途: 泛型接口
*/
package com.wu.demo.fx;
public interface Animal<T> {
public void show(T t);
}
/**
* 作者:吴奎庆
* <p>
* 时间:11/26/22
* <p>
* 用途: 泛型接口的实现类 指定泛型的类型
*/
package com.wu.demo.fx;
public class Dog implements Animal<String> {
@Override
public void show(String s) {
System.out.println(s);
}
}
/**
* 作者:吴奎庆
* <p>
* 时间:11/26/22
* <p>
* 用途: 泛型接口的实现类可以不指定泛型的类型 这个时候要声明一个泛型占位符给实现类使用
*/
package com.wu.demo.fx;
public class Cat<T> implements Animal<T> {
@Override
public void show(T t) {
System.out.print(t);
}
}
//调用
var dog = Dog();
dog.show("狗叫")
var cat = Cat<String>();
cat.show("猫叫")
3.泛型擦除
泛型只存在java 编译阶段,在运行阶段会全部擦除为Obj,限定类型,这就叫泛型擦除.泛型擦除是为了兼容老版本的代码.
为什么用泛型????
1.使用泛型可以在编译期进行类型检测,尽早发现问题
2.不使用泛型使用Object 会进行频繁的类型转换,消耗性能,减少不必要的类型转换异常
3.增加了代码的扩展性,泛型代替后,可以多种类型使用同一个逻辑
4.节省性能,减少不必要的类型转换
import org.junit.Test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
/**
* 作者:吴奎庆
* <p>
* 时间:11/27/22
* <p>
* 用途: 将List中加入不同的 数据
*/
public class TestUnit {
@Test
public void test() throws NoSuchFieldException {
ArrayList<Integer> list=new ArrayList<>();
list.add(1);
Method addFiled= null;
try {
//获取方法
addFiled = list.getClass().getDeclaredMethod("add",Object.class);
//执行方法
addFiled.invoke(list,"测试数据");
System.out.println(list.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.通配符
java中的继承关系在泛型中并不适用 所以在泛型中处理继承关系就用到了通配符.
通配符用?表示, ?表示一切类的父类
未指定类型的时候用? 表示
通配符上边界问题 ? extends T (只能读取数据,不能写入数据)
表示:确定了父类 ?是传入的数据 必须是T 以及T的子类
注意:可以读取数据但是不能写入数据 (可以处理让数据可读不可写.)
通配符下边界问题 ? super T
确定了子类,不知道父类的时候用 ?super T
所以下边界的时候只能写入不能读取.(可以处理数据不能读取的情况.)
表示:?是传入的数据 必须是T 以及T的子类
网友评论