C# 和 Java 中的方法重载

2024-04-09

我在 C# 中运行了以下方法。

public float Add(float num1, long num2)
{
    Console.WriteLine("method 1");
    return 0;
}
public float Add(int num1, float num2)
{
    Console.WriteLine("method 2");
    return 0;
}

在这里,如果我打电话Add(1,1),它给出了歧义。 现在让我交换位置float and long第一种方法如下:

public float Add(long num1, float num2)
{
    Console.WriteLine("method 1");
    return 0;
}
public float Add(int num1, float num2)
{
    Console.WriteLine("method 2");
    return 0;
}

现在它打印“方法 2”作为输出。第一种情况中含糊不清的原因是什么?

如果我在代码中编写以下两个方法:

public float Add(long num1, long num2)
{
    Console.WriteLine("method 1"); 
    return 0;
}
public float Add(int num1, float num2)
{
    Console.WriteLine("method 2");
    return 0;
}

通话中Add(1,1),它给出了歧义错误。为什么它不选择最佳匹配,这是第二种方法(有int and float)?根据我的说法,它应该给出方法 2 作为输出。


来自C#规范 https://msdn.microsoft.com/en-us/library/ms228593.aspx, 7.5.3.2 更好功能成员:

给定一个参数列表 A,其中包含一组参数表达式 { E1, E2, ..., EN } 和两个适用的函数成员 MP 和 MQ,其参数类型为 { P1, P2, ..., PN } 和 { Q1, Q2, ..., QN }, MP 被定义为比 MQ 更好的函数成员,如果

  • 对于每个参数,从 EX 到 QX 的隐式转换并不比从 EX 到 PX 的隐式转换更好,并且
  • 对于至少一个参数,从 EX 到 PX 的转换优于从 EX 到 QX 的转换。

请注意,该规范使用术语隐式转换以包括身份转换的方式。看6.1 隐式转换:

以下转换被归类为隐式转换:

  • 身份转换
  • 隐式数值转换
  • [...]

并从6.1.1 身份转换:

身份转换从任何类型转换为相同类型。 [...]


您的参数类型集是:

{ int, int }

在第一种情况下,候选人是:

{ float, long } 
{ int, float }

设 MP 为第一个候选,MQ 为第二个候选。

  • 有一个参数 X (= 1),其中从 EX 到 QX 的隐式转换is比从 EX 到 PX 的隐式转换更好:int to intint to float(因为它是同一类型)。

设 MP 为第二个候选,MQ 为第一个候选。

  • 有一个参数 X (= 2),其中从 EX 到 QX 的隐式转换is比从 EX 到 PX 的隐式转换更好:int to longint to float.

两位候选人都不满足第一点要求。规范中描述的平局打破机制在这里不适用(因为这两种方法都不是通用的,都不是可变参数,都没有可选参数等)。因此,这个调用是不明确的。


在第二种情况下,候选人是:

{ long, float }
{ int, float }

设 MP 为第一个候选,MQ 为第二个候选。

  • 有一个参数 X (= 1),其中从 EX 到 QX 的隐式转换is比从 EX 到 PX 的隐式转换更好:int to intint to long(因为它是同一类型)。

设 MP 为第二个候选,MQ 为第一个候选。

  • 没有参数 X 表明从 EX 到 QX 的隐式转换优于从 EX 到 PX 的隐式转换。
  • 有一个参数 X (= 1),其中从 EX 到 PX 的隐式转换is比从 EX 到 QX 的转换更好:int to intint to long.

由于第二个候选者满足这两个要点,因此它比第一个候选者更匹配。


在第三种情况下,候选人是:

{ long, long }
{ int, float } 

就像第一种情况一样:

  • int to intint to long.
  • But int to longint to float.

因此,该调用再次变得不明确。


The Java语言规范 https://docs.oracle.com/javase/specs/各州15.12.2.5 选择最具体的方法:

对于使用参数表达式 e1, ..., ek 的调用,如果满足以下任一条件,则一个适用的方法 m1 比另一适用的方法 m2 更具体:

  • m2 是通用的,并且根据第 18.5.4 节,对于参数表达式 e1, ..., ek,m1 被推断为比 m2 更具体。
  • m2 不是泛型,m1 和 m2 可通过严格或松散调用应用,其中 m1 具有形式参数类型 S1, ..., Sn,m2 具有形式参数类型 T1, ..., Tn,类型 Si 更重要对于所有 i (1 ≤ i ≤ n, n = k),参数 ei 比 Ti 更具体。
  • m2 不是通用的,m1 和 m2 可通过变量参数调用来应用,其中 m1 的前 k 个变量参数类型为 S1, ..., Sk,m2 的前 k 个变量参数类型为 T1, ... ., Tk,对于所有 i (1 ≤ i ≤ k) 的参数 ei,类型 Si 比 Ti 更具体。另外,如果m2具有k+1个参数,则m1的第k+1个可变数量参数类型是m2的第k+1个可变数量参数类型的子类型。

上述条件是一种方法可能比另一种方法更具体的唯一情况。

对于任何表达式,如果 S <: t s>

与之前一样,请注意,此处描述的关系包括 S 和 T 是同一类型的情况,而不是严格意义上的彼此子类型(这将是正确的子类型).

对于原始类型,描述于4.10.1 原始类型之间的子类型化:

以下规则定义了原始类型之间的直接超类型关系:

  • 双 >1 浮点数
  • 浮动 >1 长
  • 长 > 1 个整数
  • 整数 >1 个字符
  • 整数 >1 短
  • 短 >1 字节

通过这些,重载解析规则实际上与此特定情况下的 C# 相同。前面的解释是适用的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 和 Java 中的方法重载 的相关文章

  • 如何将 HTML 链接放入电子邮件正文中?

    我有一个可以发送邮件的应用程序 用 Java 实现 我想在邮件中放置一个 HTML 链接 但该链接显示为普通字母 而不是 HTML 链接 我怎样才能将 HTML 链接放入字符串中 我需要特殊字符吗 太感谢了 Update 大家好你们好 感谢
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • Delphi:写入后代类中私有祖先的字段

    我需要修复第三方组件 该组件的类具有私有变量 该变量由其后代主动使用 TThirdPartyComponentBase class private FSomeVar Integer public end TThirdPartyCompone
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • hibernate 6.0.2.Final 和 spring boot 2.7.0 的entityManagerFactory bean 未配置问题

    所以最近我想升级我的 Spring Boot 项目项目的一些依赖项 特别是这些组件 雅加达 EE 9 弹簧靴2 7 休眠 6 0 2 Final 完成此操作后 所有更新和代码折射 更新将 javax 导入到 jakarta 以及一些 hib
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • 每个租户的唯一用户名和电子邮件

    我正在使用以下代码编写多租户应用程序ASP NET Core 2 1 我想覆盖默认的与用户创建相关的验证机制 目前我无法创建多个具有相同的用户UserName My ApplicationUser模型有一个名为TenantID 我想要实现的
  • 在 Spring 上下文中查找方法级自定义注释

    我想知道的是 所有的类 方法Spring http en wikipedia org wiki Spring Framework注释为 Versioned的bean 我创建了自定义注释 Target ElementType METHOD E
  • 在java中以原子方式获取多个锁

    我有以下代码 注意 为了可读性 我尽可能简化了代码 如果我忘记了任何关键部分 请告诉我 public class User private Relations relations public User relations new Rela
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 使用restsharp序列化对象并将其传递给WebApi而不是序列化列表

    我有一个看起来像的视图模型 public class StoreItemViewModel public Guid ItemId get set public List
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft

随机推荐

  • 如何修复 css({ float: 'left' }) [重复] 上的闭包编译器错误

    这个问题在这里已经有答案了 可能的重复 Google Closure 编译器解析错误 属性 ID 无效css float left https stackoverflow com questions 6611867 google closu
  • Android MotionEvent.ACTION_MASK

    在 OnTouchEvent 中 如果您使用以下命令切换不同的触摸操作 switch e getAction 它处理 ACTION DOWN 和 ACTION MOVE 但由于某种原因它不会捕获 ACTION POINTER DOWN 而如
  • 使用 T-Sql,如何将远程服务器上的一个表插入到本地服务器上的另一个表中?

    给定远程服务器 生产 当前可通过 IP 访问 和本地数据库 开发 我如何运行INSERT使用 T SQL 从 生产 进入 开发 我使用的是 MS SQL 2005 两个数据库之间的表结构有很大不同 因此我需要手动编写一些迁移脚本 UPDAT
  • 从 Excel 中选定的选项卡中选取数据

    我有以下问题 我有一个包含许多选项卡的文件 每个选项卡的名称是一个国家 地区 选项卡中包含有关该国家 地区的各种数据 我想创建一个界面选项卡 用户可以在其中将国家 地区名称放入单元格中 例如 法国 单元格 A1 将数据项放入另一个单元格中
  • Hbase 列族

    Hbase 文档表示 避免创建超过 2 3 个列族 因为 Hbase 不能很好地处理超过 2 3 个列族 其原因在于压缩和刷新 以及 IO 但是 如果我的所有列总是填充 对于每一行 那么我认为这个推理并不那么重要 因此 考虑到我对列的访问是
  • C# 命名空间是否编译为 IL 文件作为“完整”名称?

    例如 如果我有 namespace a namespace b class C class D 那么编译完成后 IL文件中的命名空间信息在哪里呢 我是否会得到两个名为 a b C 和 a b D 的类 其中类名以命名空间名称为前缀 或者我在
  • 在Delphi中销毁COM对象

    有一些 net程序集 通过COM在delphi中调用它 var intf ITest intf CreateComObject CLASS TEST as ITest here comes some stuff 我必须做点什么来破坏它以释放
  • COM 互操作、隔离和排除重复引用

    我们在我们编写的 C dll 程序集 A 中使用 Microsoft 提供的 COM DLL dsofile dll 为了避免必须注册 COM dll 我已将对 dsofile dll 的引用的isolated 属性切换为 true 这意味
  • 使用 CSS3 在文本上创建双色锐渐变

    我需要为我正在构建的网站上的标题和导航文本创建 锐利 渐变 我正在尝试使其尽可能纯 HTML5 CSS3 并且愿意坚持使用 font face而不是转移到Cufon 我所说的锐渐变是指两种颜色 两者之间没有混合 例子 http dl dro
  • Apache NIFI Jon 不会自动终止

    我是 Apache NIFI 工具的新手 我正在尝试从 mongo db 导入数据并将该数据放入 HDFS 中 我创建了 2 个处理器 第一个用于 MongoDB 第二个用于 HDFS 并且我正确配置了它们 该作业正在成功运行并将数据存储到
  • 由于错误而导致代码崩溃:无法从空集合中删除最后一个元素

    我正在尝试绘制一些数据图表 以下代码最初可以工作 并且有时可以工作 但现在似乎大部分崩溃 我认为 json 函数中的 if let data data 行意味着它只会运行一旦它收到数据 我有一种感觉 也许该函数在完全加载之前正在解包数据 但
  • 基于 STOMP 身份验证的 Spring 4 WebSocket

    我正在开发一个基于 Spring 4 WebSocket 的多人游戏 我的服务器是无状态的 因此为了识别玩家 我使用令牌 经过一段时间的努力 如何通过 WebSockets 识别玩家 我想出了这个解决方案 在客户端玩家寄存器上 如下所示 v
  • 如何计算 CRC 中使用的 XOR 余数?

    我试图记住如何计算循环冗余检查中的 XOR 算法的剩余部分以验证网络消息的剩余位 我不应该扔掉那本教科书 这在代码中很容易完成 但是如何手动计算出来呢 我知道它看起来像标准除法算法 但我不记得从那里去哪里获得余数 1010 10110100
  • RubyMine 对 jQuery 的支持

    我正在使用 RubyMine 3 1 开发 Rails3 应用程序 今天我从 Prototype 切换到 jQuery 以满足我的 UJS 需求 使用自定义一切后这个例子 http www stjhimy com posts 7 creat
  • 有没有通过 fstat() 的 POSIX 方法来检查文件是否是符号链接?

    有没有 POSIX 方式通过fstat 2 检查文件是否是符号链接 有旗帜O NOFOLLOW in open 2 可以检查它 但是 它不是 POSIX 有S ISLNK in fstat 2 其中说man fstat The S ISLN
  • 使用 webpack 构建 (React) 同构 web 应用程序的服务器部分,包括 CSS 样式加载器

    我正在尝试制作一个我正在开发的同构 React 应用程序 中的一个这样做的已知问题 https reactjsnews com isomorphic react in real lifewebpack 加载器允许import require
  • 使用点表示法访问对象的数字属性

    为什么我们不能使用点符号而不是方括号符号来访问这个类似数组的对象的属性 function testArray rat return typeof arguments console log testArray test object fun
  • 简单的 Javascript 替换为循环

    我尝试用数组索引值替换字符串中的所有出现位置 如下所示 var str a href 0 title 1 a var params params push Url TitleDisplay for i in params var x i g
  • 将 HTML 转换为 RDF

    我正在寻找一个通用的 API Web 服务 工具 等等 它允许将给定的 HTML 页面转换为尽可能具体的 RDF 图 最有可能使用主干本体和 或映射器 你证明了吗GRDDL http www w3 org 2001 sw wiki GRDD
  • C# 和 Java 中的方法重载

    我在 C 中运行了以下方法 public float Add float num1 long num2 Console WriteLine method 1 return 0 public float Add int num1 float