gpt4 book ai didi

java - 使用 import static 使用相同的方法名称但具有不同的签名时出现意外编译错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:55:03 30 4
gpt4 key购买 nike

出于某种原因,我在执行此操作时遇到编译错误:

package mypackage2;

public class YYY {

public static void aMethod(int i, int j) {
System.out.println("aMethod with Integers: " + i + " " + j);
}
}

-

package mypackage;

import static mypackage2.YYY.*;

public class XXX {

public XXX() {
aMethod(1, 1); // <--- mypackage\XXX.java:8: error: method aMethod in class XXX cannot be applied to given types;
// aMethod(1, 1);
// ^

}

private void aMethod(String s1, String s2) {
System.out.println("aMethod with Strings: " + s1 + " " + s2);
}

public static void main(String[] args) {
new XXX();
}
}

输出:

$ javac mypackage/XXX.java mypackage2/YYY.java
mypackage\XXX.java:8: error: method aMethod in class XXX cannot be applied to given types;
aMethod(1, 1);
^
required: String,String
found: int,int
reason: actual argument int cannot be converted to String by method invocation conversion
1 error

但是如果我注释掉:

private void aMethod(String s1, String s2) {
System.out.println("aMethod with Strings: " + s1 + " " + s2);
}

那就没有问题了。

当您扩展具有相同方法名称的另一个类时可以做到这一点,为什么在进行静态导入时不能做到这一点?

最佳答案

这实际上是预期的行为,因为在类 XXX 的范围内,名称 aMethod 解析为 XXX.aMethod(String, String) 方法。

您应该检查 JLS 6.4.1. ShadowingJLS 15.12 Method Invocation Expression进行解释。

使用阴影规则

Shadowing 描述了一种情况,即内部作用域从外部作用域重新定义名称,以便在内部作用域内,简单名称引用内部作用域中的实体,而需要完全限定名称来引用外部作用域中的实体。

静态导入在文件范围内定义aMethod名称,XXX.aMethod声明在XXX类范围内定义aMethod名称。方法调用发生在 XXX 类的范围内,因此简单名称 aMethod 解析为 XXX.aMethod

使用方法调用规则

选择方法的过程在JLS 15.12 Method Invocation Expression中描述。它包括三个步骤:

  1. 选择一个类来查找方法。
  2. 根据参数类型选择特定方法。
  3. 检查一切是否正常。

第一步涉及检查包含调用点的某个类是否具有具有该名称的方法。仅当第一步未找到适用的类时,才会在第二步中检查静态导入。

将其应用于您的示例:

  • 在第一步中,选择 XXX 是因为 aMethod 方法的调用包含在 XXX 类范围内,并且 XXX 有一个具有该名称的方法。
  • 在第二步中,将搜索 XXX 来查找具有该名称的所有方法,并检查每个此类方法是否可以应用于给定的参数列表。没有 XXX.aMethod 方法可以采用 (int, int) 参数,因此编译器会因编译错误而停止。

关于java - 使用 import static 使用相同的方法名称但具有不同的签名时出现意外编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22863817/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com