【问题标题】:How to use a static import for java.util.Arrays.toString?如何对 java.util.Arrays.toString 使用静态导入?
【发布时间】:2020-05-04 19:58:46
【问题描述】:

考虑以下两个简单的java代码sn-ps:

import java.util.Arrays;
class Okay {
    public static void main(String... args) {
        System.out.println(Arrays.toString(new int[0]));
    }
}

这很好用。但如果我经常使用 toString,我可能会想使用静态导入,如下所示:

import static java.util.Arrays.toString;
class DoesNotCompile {
    public static void main(String... args) {
        System.out.println(toString(new int[0]));
    }
}

如果我尝试这样做,Java 会认为我正在尝试从 Object 调用 toString(),然后抱怨 toString 不接受任何参数。这似乎很愚蠢:我在一个静态方法中,所以 toString 甚至不应该被考虑。 (即使在实例方法中,我觉得Java应该在这里得到正确的答案。)

有什么办法可以解决这个问题,或者如果该名称已被“采用”,则静态导入不起作用?

【问题讨论】:

  • 名为toString 的“最接近”的方法是你继承的,所以没有。但是,您始终可以在同一类或另一个类中定义具有不同名称的方法,例如 arrToStr
  • 是的,我定义了 str(),但这似乎是一个烦人的解决方法。哦,好吧。

标签: java compiler-errors overloading overload-resolution


【解决方案1】:

不,没有办法解决这个问题。

[来自 JLS 15.12,方法调用表达式] (https://docs.oracle.com/javase/specs/jls/se14/html/jls-15.html#jls-15.12)(更具体地说,来自 15.12.1,“确定要搜索的类或接口”)

  • 如果form是MethodName,即只是一个Identifier,那么:

    如果标识符出现在具有该名称的方法声明的范围内(第 6.3 节、第 6.4.1 节),则:

    • 如果存在该方法是其成员的封闭类型声明,则令 T 为最里面的此类类型声明。要搜索的类或接口是 T。

      此搜索策略称为“梳状规则”。在查找封闭类及其超类层次结构中的方法之前,它有效地查找嵌套类的超类层次结构中的方法。有关示例,请参见 §6.5.7.1。

    • 否则,由于一个或多个单静态导入或按需静态导入声明,方法声明可能在范围内。没有要搜索的类或接口,因为要调用的方法稍后确定(第 15.12.2.1 节)。

因此,“本地”方法将始终在静态导入之前匹配。

【讨论】:

  • 哇,真快!我想知道为什么他们不只是将所有内容合并到一个快乐的超载集合中。或者至少继续寻找找到的东西是否无法调用。也许他们认为这太复杂了,不值得。那好吧。谢谢!
  • @MarkVY 我的印象是导入(和包)是一个快速的附加组件,而没有真正探索边缘情况。例如,仅存在默认包;和this
  • 嘿,我喜欢默认包!这是我最喜欢的包裹! :) Re: ArrayList 示例...这很烦人,但在实践中很少见,因为包名通常是小写的,但类名通常是大写的。但重点。
猜你喜欢
  • 1970-01-01
  • 2019-12-10
  • 2019-09-21
  • 2019-11-04
  • 2021-04-18
  • 2015-03-20
  • 1970-01-01
  • 2014-12-04
  • 2017-05-02
相关资源
最近更新 更多