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

杭州哪里做网站好建设网站公司哪儿济南兴田德润有活动吗

杭州哪里做网站好,建设网站公司哪儿济南兴田德润有活动吗,阿里巴巴电子商务网站,个人可以建设网站吗文章目录133. Java 泛型 - 目标类型与方法参数:重载解析与类型推导**1. 目标类型如何影响方法参数?****2. 目标类型在方法重载中的应用****📌 例子:Runnable 与 Callable****✅ 示例 1:方法重载****3. Lambda 表达式的…

文章目录

  • 133. Java 泛型 - 目标类型与方法参数:重载解析与类型推导
    • **1. 目标类型如何影响方法参数?**
    • **2. 目标类型在方法重载中的应用**
      • **📌 例子:Runnable 与 Callable**
      • **✅ 示例 1:方法重载**
      • **3. Lambda 表达式的目标类型推断**
      • **4. 方法调用时 Lambda 表达式的目标类型**
        • **✅ 示例 2:明确调用 `Runnable` 版本**
        • **✅ 示例 3:明确调用 `Callable<T>` 版本**
        • **✅ 示例 4:传递 Lambda 表达式**
      • **5. 目标类型的局限性**
      • **6. 结论**

133. Java 泛型 - 目标类型与方法参数:重载解析与类型推导

在 Java 中,目标类型(Target Type) 让编译器能够根据方法参数的类型来推断 Lambda 表达式的类型。
当一个方法被重载(Overloading),且参数类型可以是不同的函数式接口时,Java 编译器会通过“重载解析”和“类型参数推理”来决定调用哪个方法


1. 目标类型如何影响方法参数?

Java 编译器使用两种机制来决定 Lambda 表达式的类型
重载解析(Overload Resolution)
类型参数推理(Type Inference)


2. 目标类型在方法重载中的应用

📌 例子:Runnable 与 Callable

Java 提供了两个常见的函数式接口

public interface Runnable {void run();
}public interface Callable<V> {V call();
}

🔹 Runnable.run() 没有返回值void)。
🔹 Callable<V>.call() 有返回值,返回类型为 V


✅ 示例 1:方法重载

我们定义了两个重载方法 invoke

public class TargetTypeDemo {void invoke(Runnable r) {r.run();}<T> T invoke(Callable<T> c) {return c.call();}
}

如果我们调用:

String s = invoke(() -> "done");

🧐 问题:invoke(() -> "done") 调用的是哪个方法?


3. Lambda 表达式的目标类型推断

编译器需要确定 () -> "done"Runnable 还是 Callable<T>

Runnable 版本(不匹配)

void invoke(Runnable r) {r.run(); // 运行时不会返回任何值
}
  • Runnable.run() 没有返回值,而 invoke(() -> "done") 期望返回 String,所以 Runnable 不匹配

Callable<T> 版本(匹配)

<T> T invoke(Callable<T> c) {return c.call(); // `call()` 返回 T(在这里是 String)
}
  • Callable<String> 期望 call() 方法有返回值,而 () -> "done" 返回 "done",因此它符合 Callable<String> 类型。
  • 最终调用 invoke(Callable<T>) 版本,返回 "done"

4. 方法调用时 Lambda 表达式的目标类型

让我们看一些不同的调用方式,看看 Lambda 如何推断目标类型👇

✅ 示例 2:明确调用 Runnable 版本
invoke((Runnable) () -> System.out.println("Running"));

🔍 解析

  • (Runnable) () -> System.out.println("Running") 强制转换为 Runnable,所以 invoke(Runnable r) 被调用。
  • run() 方法不返回值,因此不会返回任何内容。

✅ 示例 3:明确调用 Callable<T> 版本
String result = invoke((Callable<String>) () -> "Task completed");
System.out.println(result); // 输出: Task completed

🔍 解析

  • (Callable<String>) () -> "Task completed" 强制转换为 Callable<String>,调用 invoke(Callable<T>) 版本。
  • call() 返回 "Task completed",并赋值给 result

✅ 示例 4:传递 Lambda 表达式
invoke(() -> {System.out.println("Hello");
});

🔍 解析

  • invoke(Runnable r) 被调用,因为 System.out.println("Hello") 没有返回值,符合 Runnable.run() 的签名。

5. 目标类型的局限性

🚨 ⚠️ 编译器可能无法推断 Lambda 的目标类型!

Object obj = () -> "Hello"; // ❌ 编译错误

🔍 解析

  • Object 不是函数式接口,因此 无法推断 Lambda 的类型,会导致编译错误

👉 解决方案:显式声明类型

Callable<String> callable = () -> "Hello"; // ✅ 正确
Object obj = (Callable<String>) (() -> "Hello"); // ✅ 正确

6. 结论

Java 编译器利用目标类型来决定 Lambda 表达式的具体类型
重载解析(Overload Resolution)会选择返回值匹配的函数式接口
Lambda 需要明确的目标类型,否则编译器可能无法推断类型
使用显式类型转换(Casting)可以强制指定目标类型

🎯 目标类型 + Lambda 让 Java 泛型推导更智能,减少了不必要的类型声明,使代码更简洁!🚀

http://www.dtcms.com/a/495796.html

相关文章:

  • 引流人脉推广软件莆田seo外包公司
  • SeC - 视频对象分割/AI抠像/视频绿幕抠像/视频一键换背景 支持50系显卡 一键整合包下载
  • 【ROS2】gdb、coredump 调试ROS2程序
  • h5页面生成青岛网站seo公司
  • PRNet:原始信息即全部所需
  • 【文档】部署 MySQL-Exporter
  • 南宁网站seo服务绛帐做网站
  • 10.17 枚举中间|图论
  • if条件语句 三目运算符 汇编分析
  • LeetCode 401 - 二进制手表
  • 【Leetcodenowcode数据结构】顺序表的应用
  • 软考高项论文考试攻略2:从备考到写作的专业指南
  • vue2和vue3函数式调用组件学习记录
  • 廊坊市固安县建设局网站中小企业网络设计论文
  • 3D打印技术在金属材料上的应用现状
  • 网站数据库丢失注册公司网站需要什么资料
  • 重生之我在大学自学鸿蒙开发第九天-《分布式流转》
  • 做手机网站公司wordpress萌主题下载
  • 【Android15快速自定义与集成音效实战课】:正式上线了(二百六十二)
  • 数字化时代,企业应该如何看待商业智能BI
  • 算法---队列+宽搜
  • 解锁分布式唯一 ID:技术、实践与最佳方案
  • 检察院门户网站建设方案网站建设a2345
  • GB200 NVL72超节点深度解析:架构、生态与产业格局
  • 课程网站的设计做网站被骗去哪投诉
  • YOLO家族进化史:从V1到V3的跨越
  • Lipschitz连续及其常量
  • 个人做网站公司宁波趋势信息科技有限公司
  • 安装好采集侠网站地图后在哪里查看网站地图精准粉丝引流推广
  • 外贸soho怎么建网站网站的分辨率