当前位置: 首页 > news >正文

Java 方法前面加 <T> 是做什么?泛型方法

在 Java 中,方法前面加上 <T> 表示该方法是一个泛型方法泛型方法允许你在方法签名中指定一个或多个类型参数,从而使得该方法可以处理多种类型的对象。这增加了代码的灵活性和复用性。

一、基本语法

<T1, T2, ..., Tn> 返回类型 方法名(形参列表) {// 方法体
}
  • <T1, T2, ..., Tn>:类型参数列表,可以有一个或多个类型参数。
  • 返回类型:方法的返回类型,可以是具体的类型,也可以是类型参数。
  • 方法名:方法的名称。
  • 形参列表:方法的参数列表,可以使用类型参数作为参数类型。

 二、代码示例

1. 单个类型参数的泛型方法

 假设现在富士康(Foxconn)要生产一批手机,它给手机厂商定下了一个规范:

package com.study.genericity.entity;/*** 富士康的手机生产规范*/
public abstract class MobilePhone {abstract void produce();
}

 OPPO、Huawei 都按照 富士康 的规范(extends MobilePhone)生产手机:

package com.study.genericity.entity;
import lombok.AllArgsConstructor;@AllArgsConstructor
public class OPPO extends MobilePhone {/** 型号 */private String model;/** 颜色 */private String color;/** 运行内存 */private String ram;/** 存储 */private String rom;@Overridepublic void produce() {System.out.println("正在生产 OPPO手机 :型号-"+model+" 颜色-"+color+" 运行内存-"+ram+" 存储容量-"+rom);}
}
----------------------------------------
package com.study.genericity.entity;
import lombok.AllArgsConstructor;@AllArgsConstructor
public class Huawei extends MobilePhone {/** 型号 */private String model;/** 颜色 */private String color;/** 是否折叠 */private boolean foldOrNot;/** 运行内存 */private String ram;/** 存储 */private String rom;@Overridepublic void produce() {String description = "正在生产 华为手机 :"+(foldOrNot?"折叠屏 ":"")+model+" "+color+" "+ram+" "+rom;System.out.println(description);}
}

 富士康 为他们开了一条通用生产线生产手机:

package com.study.genericity.entity;public class Foxconn {/** 富士康通用生产线 */public static void produce(MobilePhone mobilePhone) {mobilePhone.produce();}public static void main(String[] args) {OPPO oppo = new OPPO("Find X7", "白日梦想家", "12GB", "256GB");produce(oppo);Huawei huawei = new Huawei("Pocket 2", "洛可可白", true, "12GB", "256GB");produce(huawei);}
}
输出:
正在生产 OPPO手机 :型号-Find X7 颜色-白日梦想家 运行内存-12GB 存储容量-256GB
正在生产 华为手机 :折叠屏 Pocket 2 洛可可白 12GB 256GB

 这个时候来了苹果,他们委托 富士康 生产新版 iPhone。

不过苹果 它财大气粗,它有自己的手机生产规范:

package com.study.genericity.entity;/*** 苹果自己的移动产品生产规范*/
public  abstract class AppleMobile {abstract void producePhone();
}
----------------------------------------
package com.study.genericity.entity;import lombok.AllArgsConstructor;@AllArgsConstructor
public class Apple extends AppleMobile {/** 型号 */private String model;/** 颜色 */private String color;/** 运行内存 */private String ram;/** 存储 */private String rom;@Overridepublic void producePhone() {System.out.println("正在生产 尊贵的iPhone :"+model+" "+color+" "+ram+" "+rom);}
}

 富士康 本来想拒绝,因为苹果的生产流程已经继承了 AppleMobile 规范, 无法再继承 MobilePhone 规范,两个规范并不兼容(Java 单继承)。但如果为苹果单开一条生产线,成本又特别高昂。

package com.study.genericity.entity;public class Foxconn {/** 富士康通用生产线 */public static void produce(MobilePhone mobilePhone) {mobilePhone.produce();}/** 为苹果单开一条流水线 */public static void produce(AppleMobile appleMobile) {appleMobile.producePhone();}public static void main(String[] args) {OPPO oppo = new OPPO("Find X7", "白日梦想家", "12GB", "256GB");produce(oppo);Huawei huawei = new Huawei("Pocket 2", "洛可可白", true, "12GB", "256GB");produce(huawei);Apple apple = new Apple("iPhone 16 Pro", "白", "16GB", "128GB");produce(apple);}
}
输出:
正在生产 OPPO手机 :型号-Find X7 颜色-白日梦想家 运行内存-12GB 存储容量-256GB
正在生产 华为手机 :折叠屏 Pocket 2 洛可可白 12GB 256GB
正在生产 尊贵的iPhone :iPhone 16 Pro 白 16GB 128GB

 这可愁坏了 富士康 的老总,这个时候,聪明的工程师 小林 为老板想了一个办法,他用 泛型方法 的方式,定义了一条通用的流水线,可以忽略类型规范:

package com.study.genericity.entity;import java.util.function.Consumer;public class Foxconn {/** 用 泛型方法 定义通用生产流水线 */public static <T> void produce(Consumer<T> consumer, T phone) {consumer.accept(phone);}public static void main(String[] args) {OPPO oppo = new OPPO("Find X7", "白日梦想家", "12GB", "256GB");produce(OPPO::produce, oppo);Huawei huawei = new Huawei("Pocket 2", "洛可可白", true, "12GB", "256GB");produce(Huawei::produce, huawei);Apple apple = new Apple("iPhone 16 Pro", "白", "16GB", "128GB");// 苹果 定制化生产produce(Apple::producePhone, apple);}
}
输出:
正在生产 OPPO手机 :型号-Find X7 颜色-白日梦想家 运行内存-12GB 存储容量-256GB
正在生产 华为手机 :折叠屏 Pocket 2 洛可可白 12GB 256GB
正在生产 尊贵的iPhone :iPhone 16 Pro 白 16GB 128GB

富士康 老板高兴坏了,因为这条流水线太好用,老板甚至放弃了自定义的手机生产规范 MobilePhone,给手机厂商更高的自由度(不用再继承 MobilePhone),去生产定制化的手机产品:

package com.study.genericity.entity;
import lombok.AllArgsConstructor;@AllArgsConstructor
public class Huawei {/** 型号 */private String model;/** 颜色 */private String color;/** 是否折叠 */private boolean foldOrNot;/** 运行内存 */private String ram;/** 存储 */private String rom;/** 定制化生产 */public void produceHuawei() {String description = "正在生产 华为手机 :"+(foldOrNot?"折叠屏 ":"")+model+" "+color+" "+ram+" "+rom;System.out.println(description);}
}
---------------------------------------------
package com.study.genericity.entity;
import lombok.AllArgsConstructor;@AllArgsConstructor
public class OPPO {/** 型号 */private String model;/** 颜色 */private String color;/** 运行内存 */private String ram;/** 存储 */private String rom;/** 定制化生产 */public void produceOPPO() {System.out.println("正在生产 OPPO手机 :型号-"+model+" 颜色-"+color+" 运行内存-"+ram+" 存储容量-"+rom);}
}
---------------------------------------------
package com.study.genericity.entity;import java.util.function.Consumer;public class Foxconn {/** 用 泛型方法 定义通用生产流水线 */public static <T> void produce(Consumer<T> consumer, T phone) {consumer.accept(phone);}public static void main(String[] args) {OPPO oppo = new OPPO("Find X7", "白日梦想家", "12GB", "256GB");// OPPO 定制化生产produce(OPPO::produceOPPO, oppo);Huawei huawei = new Huawei("Pocket 2", "洛可可白", true, "12GB", "256GB");// 华为 定制化生产produce(Huawei::produceHuawei, huawei);Apple apple = new Apple("iPhone 16 Pro", "白", "16GB", "128GB");// 苹果 定制化生产produce(Apple::producePhone, apple);}
}
输出:
正在生产 OPPO手机 :型号-Find X7 颜色-白日梦想家 运行内存-12GB 存储容量-256GB
正在生产 华为手机 :折叠屏 Pocket 2 洛可可白 12GB 256GB
正在生产 尊贵的iPhone :iPhone 16 Pro 白 16GB 128GB


http://www.mrgr.cn/news/41328.html

相关文章:

  • 2025河南国际台球产业展览会,中国国际台球产业链发展大会
  • 【EXCEL数据处理】000010 案列 EXCEL文本型和常规型转换。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。
  • 完全背包问题
  • 声纳技术24.1.19声纳定向方法
  • C++类和对象(上)
  • rtmp协议转websocketflv的去队列积压
  • 【EXCEL数据处理】000011 案列 EXCEL带有三角形图标的单元格转换,和文本日期格式转换。
  • 三、数据链路层(下)
  • HCIP-HarmonyOS Application Developer 习题(四)
  • 药物识别与分类系统源码分享
  • 【MySQL报错】---Data truncated for column ‘age‘ at row...
  • [C++] 剖析AVL树功能的实现原理
  • 硬件面试(一)
  • 深入剖析JavaScript中的encodeURIComponent函数:原理、应用及注意事项
  • Linux查看触摸坐标点的方法,触觉智能RK3562开发板,瑞芯微、全志等通用
  • 数据库索引和磁盘的关系大揭秘
  • rabbitMq------信道管理模块
  • 第十二章 异常处理
  • 视频创作黑科技!CogVideoX秒生成艺术视频
  • 算法知识点————数论和链表