您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Java方法重载-相同继承树中的通用参数

Java方法重载-相同继承树中的通用参数

语言规范中说明了确定在编译时调用哪个方法签名的规则。特别重要的是选择最具体方法的部分。以下是与您的问题有关的部分:

如果多个成员方法既可访问又可应用于方法调用,则必须选择一个成员方法来为运行时方法分派提供描述符。Java编程语言使用选择 最具体@H_419_5@ 方法的规则。

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

m2是通用的,由§18.5.4 推断比参数表达式… 更具体。m1``m2``e1``ek

m2不是通用的,并且是适用通过严格或松散调用,并且其中具有形参类型S1,…,Sn和具有形参类型? 1,…,T Ñ,S型我比更具体? 我为参数对于所有 我@H_419_5@ (1≤ 我@H_419_5@ ≤ ñ@H_419_5@ , ñ@H_419_5@ = ?@H_419_5@ )。m1``m2``m1``m2``ei __

如果S <:T(第4.10节),则对于任何表达式,类型S 都比类型T 更具体@H_419_5@ 。

在这种情况下,由于Integer比extends 更具体,所以每当编译器检测到对该调用采用了 声明@H_419_5@ 为type 的变量的调用时,都会为添加一个调用Number``Integer``Number``foo __Integer``foo(Integer)

本节将详细介绍与第二种方法有关的第一种条件有关的更多信息。这有点冗长,但我认为重要的部分是:

当测试一种适用的方法比另一种适用的方法 更具体时@H_419_5@ (第15.12.2.5节),如果第二种方法是通用的,则必须测试是否可以推断出第二种方法的类型参数的某些实例化,以使第一种方法比第二。

让是第一种方法,并是第二种方法。其中有一个类型参数p 1,…,P p,让α 1,…,α p是推断变量,并让θ是取代[P 1:=α 1,…,P p:= α p ]。m1``m2``m2

确定是否比下面更具体的过程如下:m1``m2

如果T i是适当的类型,则对于e i(§15.12.2.5),如果S i比T i更具体,则结果为 true;@H_419_5@ 否则为 false@H_419_5@ 。(请注意,S i始终是适当的类型。) __

基本上,这意味着foo(Number)foo(Integer)两者都比foo(T)因为编译器可以推断出至少一种类型的泛型方法(例如,Number本身)foo(Number)foo(Integer)更具体(这是因为Integer <: NumberNumber <: Number)更具体(这是因为和)。

这也意味着在您的代码foo(T)中,仅适用于传递a的调用(由于它仅是一种适用的方法,因此本质上是最具体的方法String

java 2022/1/1 18:28:41 有466人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶