- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道这个问题讨论过很多次,但我还是不明白。
研究这段代码:
public class Main {
public static void var(Integer x, int y) {
System.out.println("Integer int");
}
public static void var(int... x) {
System.out.println("int... x");
}
public static void var(Integer... x) {
System.out.println("Integer...");
}
public static void main(String... args) {
byte i = 0;
Integer i2 = 127;
var(i, i2);
}
}
在我的大脑中遵循以下规则:
加宽
拳击
装箱+可变参数
根据这个规则我做下一步的 Action
1.byte 宽度为 int
现在我有 int
Integer
并且存在方法采用 Integer
和 int
2.打拳
因此。 int
-> Integer
和 Integer
-> int
参数
我认为论点是适用的,期待看到
Integer int
在输出中。
但是我明白了
int ...
为什么?
最佳答案
现在很清楚方法var(int...)
被选中而不是 var(Integer...)
.
原因是只允许应用某些转换,并且只能是列表中的这些转换之一,而不是转换链。java 编译器不允许先进行扩大原始类型转换,然后再进行装箱转换。
它在 Java Language Specification in section 5.3 中指定
5.3. Method Invocation Conversion
Method invocation conversion is applied to each argument value in a method or constructor invocation (§8.8.7.1, §15.9, §15.12): the type of the argument expression must be converted to the type of the corresponding parameter.
Method invocation contexts allow the use of _one of_ the following:
- an identity conversion (§5.1.1)
- a widening primitive conversion (§5.1.2)
- a widening reference conversion (§5.1.5)
- a boxing conversion (§5.1.7) optionally followed by widening reference conversion
- an unboxing conversion (§5.1.8) optionally followed by a widening primitive conversion.
编译器唯一的选择是:
那变成了(byte, Integer)
进入(int, int)
.
它不能首先转动第一个参数 byte
进入 int
然后对来自 int
的相同参数应用装箱转换至 Integer
因为不允许依次进行两次转换。
让我们回头看看编译器是如何选择调用哪个重载方法的。这在 JLS 15.12.2 中有描述。 . (15.12.1描述了如何查找要搜索的类或接口(interface),但是我们已经知道我们要调用类中的静态方法Main
)
编译器为选择正确的重载方法而经历的前两个阶段不适用于可变参数(“可变元数”)方法,但第三阶段适用:
The third phase (§15.12.2.4) allows overloading to be combined with variable arity methods, boxing, and unboxing.
第 15.12.4 节相当复杂,但这里适用的规则是:
所以..
var
的方法与 (byte, Integer)
var(Integer...)
byte
, 至 Integer
(方法中参数的声明类型)byte
到Integer
直接 - 它不能执行两个步骤。var(Integer...)
var(int...)
byte
到int
使用扩大原始转换。这是一个复选标记。Integer
,它看到 JLS 5.3 允许编译器将其转换为 int
使用拆箱转换。所以这也是一个复选标记。var(int...)
是一个很好的匹配。var
, 所以 var(int...)
是唯一适用的方法。编译器现在将生成代码以进行必要的转换并调用该方法。关于java - java中的重载方法优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22590914/
int x = 1; System.out.println( x++ + x++ * --x ); 上面的代码打印出“5”,但我不明白怎么办?我一直为最后一个 x 取零,然后乘以仍然为 0 的第二个
我现在正在尝试使用 Preference 类 首选项 pfrOfThis = Preferences.userNodeForPackage(this) 出现错误: “类 java.util.prefs
用下面的代码 import sys print "Hello " + sys.argv[1] if len(sys.argv) > 1 else "Joe" + "." 当我运行时 python he
我的网页包含: td { padding-left:10px; } 引用的样式表包含: .rightColumn * {margin: 0; padding: 0;} 我在 rightc
使用 JPA 我有一个关于 CascadeTypes 的问题。 例如: @ManyToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST,
下面的“括号”是怎么写的? val words = List("foo", "bar", "baz") val phrase = "These are upper case: " + words ma
我只是想知道,对于以下代码,编译器是否单独使用关联性/优先级或其他一些逻辑来评估。 int i = 0, k = 0; i = k++; 如果我们根据关联性和优先级进行评估,postfix ++具有比
我设置了一个 Azure FrontDoor 服务,以主/备份类型的方式将流量分配给两个 API 管理服务。就像我希望所有流量都流向我的主要 APIM 服务一样,如果我碰巧关闭该服务(假装中断),那么
这是一个简单的 CSS: /* Smartphones (portrait and landscape) ----------- */ @media only screen and (min-devi
我设置了一个 Azure FrontDoor 服务,以主/备份类型的方式将流量分配给两个 API 管理服务。就像我希望所有流量都流向我的主要 APIM 服务一样,如果我碰巧关闭该服务(假装中断),那么
来自 Programming Perl pg 90,他说: @ary = (1, 3, sort 4, 2); print @ary; 排序右侧的逗号在排序之前求值,而左侧的逗号在排序之
+----+------------+------+ | id | title | lang | +----+------------+------+ | 1 | title 1 EN |
如何使用 Java 获取 DiffServe 代码点 (DSCP) 整数的优先级部分?我预计它涉及位移位,但由于某种原因,我似乎无法获得我期望的值。 最佳答案 假设我理解正确,只需向右执行 3 位逻辑
我有下一个运行良好的 js 函数: $(function () { $(".country").click(function () { var countries = Arra
int a[3]={10,20,30}; int* p = a; cout << *p++ << endl; 根据 wikipedia ,后缀++的优先级高于解引用,*p++应该先运行p++再解引用结
我想在优先读取归档后解决这种类型的表达式 2+3/5*9+3-4 这是我尝试解决该任务的代码我该如何解决这个问题 while ( !inputFile.eof() ) { getline( inp
我正在玩 Rhino 并注意到这种奇怪的行为似乎是运算符优先级: js> {}+{} NaN js> ''+{}+{} [object Object][object Object] js> ''+({
我想遍历文件列表并检查它们是否存在,如果文件不存在则给出错误并退出。我写了下面的代码: FILES=( file1.txt file2.txt file3.txt ) for file in ${FI
我正在执行级联 SELECT: SELECT * FROM x WHERE a = 1 AND b = 2 AND c = 3 => If nothing found, try: SELECT * F
即将参加考试,我正在参加之前的考试。 问题: 当两个或多个样式表规则应用于同一元素时,以下哪种类型的规则将优先? 一个。任何来自浏览器的声明 b.有用户来源的正常声明 C。作者来源正常声明 d.文档级
我是一名优秀的程序员,十分优秀!