Java 泛型
Java 泛型
泛型在Java中被称之为”JAVA类型”,简称GJ。泛型是JavaSE平台1.5版本增加的新特性。泛型在Java中不是一种数据类型,是一种在编译时期的特殊语法,
它能够让JVM识别从而确定在应用泛型的操作中体现泛型特点,帮助程序员在开发中从泛型中获得更高效和更安全数据的管理操作。
泛型由于不是一种Java的数据类型所以在运行时,JVM将使用擦除法将泛型描述还原成未应用泛型语法的规则进行执行。
泛型基本语法:<T>
泛型能够在代码书写过程中帮助程序员提高效率和数据类型安全。
泛型能够在编译阶段确定数据类型是否符合要求,规避错误发生。
泛型能否避免数据对象强制类型转换操作。
泛型也能够支持在动态下确定数据类型。
import java.util.Date;
/**
* 员工实体类
*/
public class Employee {
private int id;
private String name;
private String longName;
private String password;
private Date birth;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLongName() {
return longName;
}
public void setLongName(String longName) {
this.longName = longName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}
import com.GJ.entity.Employee; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { List<Employee> employeeList=new ArrayList<Employee>(); Employee emp=new Employee(); emp.setId(1); emp.setName("十三"); Employee emp2=new Employee(); emp2.setId(2); emp2.setName("十四"); Employee emp3=new Employee(); emp3.setId(3); emp3.setName("十五"); employeeList.add(emp); employeeList.add(emp2); employeeList.add(emp3); for (Employee e:employeeList){ System.out.println(e.getName()+"\t"+e.getId()); } } }
Java通配符泛型
List<?> numList = new ArrayList<>(); 使用通配符<?>的泛型,可以把任意类型的对象丢进去。
但是缺点是,调用的时候只能用Object接收,并通过强制类型转换强转,这样就失去了泛型的一个省事儿的优势。所以最好还是使用确定了类型的泛型比较好些。
public class Demo01 {
public static void main(String[] args) {
List<Integer> intList=new ArrayList<Integer>();
intList.add(new Integer(100));
intList.add(new Integer(200));
/* List<Number> numberList=intList; //会报错*/
List<?> list=intList;
for (Object intObj:list){
System.out.println((Integer)intObj);
}
System.out.println("-----------------------------");
List<Number> numberList=new ArrayList<Number>();
numberList.add(new Double(6.66));
numberList.add(new Double(7.66));
numberList.add(new Double(16.66));
for (Number n:numberList){
System.out.println(n);
}
}
}
/**
* 使用Map集合应用泛型
*/
public class Demo02 {
public static void main(String[] args) {
Map<String, Set<Employee>> map=new HashMap<String, Set<Employee>>();
//创建员工对象
Employee emp=new Employee();
emp.setName("十三");
Employee emp2=new Employee();
emp2.setName("十四");
Set<Employee> set=new HashSet<Employee>();
set.add(emp);
set.add(emp2);
map.put("e",set);
Set<Employee> empSet=map.get("e");
for (Employee e:empSet){
System.out.println(e.getName());
}
}
}
带泛型的类
public class GJClass<T>{ //这种属于隐式泛型。显示的一般有明确的数据类型如<Integer>
public String getClassName(T t){
return t.getClass().getName();
}
}
一般情况下隐式的用的比较多,显示的用得少。
带泛型的接口
public interface CountManager<T>{
double count(T t,double r);
double count(T t,double bottom,double height);
}
总结图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!