如何使用java.util.Arrays.toString的静态导入?
考虑以下两个简单的java代码片段:如何使用java.util.Arrays.toString的静态导入?,java,compiler-errors,overloading,overload-resolution,Java,Compiler Errors,Overloading,Overload Resolution,考虑以下两个简单的java代码片段: 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.toStri
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会认为我试图从对象调用toString(),然后抱怨toString不带参数。这似乎很愚蠢:我使用的是静态方法,所以不应该考虑toString。(即使是在实例方法中,我觉得Java应该在这里得到正确的答案。)
有没有什么方法可以解决这个问题,或者如果这个名称已经被“接受”,静态导入就不起作用了?没有,没有办法解决这个问题 [来自JLS 15.12,方法调用表达式]()(更具体地说,来自15.12.1,“确定要搜索的类或接口”)
- 如果表单为MethodName,即仅为标识符,则:
如果标识符以该名称出现在方法声明的范围内(§6.3,§6.4.1),则:
- 如果有一个封闭类型声明,该方法是该声明的一个成员,那么让T作为最内部的类型声明。要搜索的类或接口是T 此搜索策略称为“梳规则”。它有效地在嵌套类的超类层次结构中查找方法,然后再在封闭类及其超类层次结构中查找方法。有关示例,请参见§6.5.7.1
- 否则,由于一个或多个静态导入或按需静态导入声明,方法声明可能在范围内。没有要搜索的类或接口,因为稍后将确定要调用的方法(§15.12.2.1)
因此,在静态导入之前,“本地”方法将始终匹配。名为
toString
的“最近”方法是您继承的方法,因此不是。但是,您始终可以在同一类或另一类中定义具有不同名称的方法,如arrToStr
。是的,我定义了str(),但这似乎是一个恼人的解决办法。哇,太快了!我想知道为什么他们不把所有的东西都合并成一个大的快乐过载集。或者至少继续寻找,如果发现的东西找不到。也许他们认为这太复杂了,不值得这么做。哦,好吧。谢谢@MarkVY我得到的印象是,进口(和包装)是一个快速插销,而没有真正探索边缘案例。例如,仅仅存在默认包;嘿,我喜欢默认的软件包!这是我最喜欢的包裹!:)回复:ArrayList示例。。。这很烦人,但在实践中很少见,因为包名通常是小写的,而类名通常是大写的。但这一点是正确的。