Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法重载方法?_Java - Fatal编程技术网

Java 无法重载方法?

Java 无法重载方法?,java,Java,我有两种方法可以做一件非常相似的事情:接收一个映射,然后将其打印到输出文件,只是它们接收不同的映射数据类型,Java(事实上是IntelliJ)不允许我重载它,并说“parse(map)”与“parse(map)”冲突;两种方法具有相同的擦除功能 方法A: private static void parse(Map<String, Long> map) { PrintWriter output = null; try { ou

我有两种方法可以做一件非常相似的事情:接收一个映射,然后将其打印到输出文件,只是它们接收不同的映射数据类型,Java(事实上是IntelliJ)不允许我重载它,并说
“parse(map)”与“parse(map)”冲突;两种方法具有相同的擦除功能

方法A:

private static void parse(Map<String, Long> map) {

        PrintWriter output = null;
        try {
            output = new PrintWriter("output1.csv");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        assert output != null;
        map.entrySet().forEach(output::println);
        output.close();
    }
私有静态无效解析(映射){
PrintWriter输出=null;
试一试{
输出=新的PrintWriter(“output1.csv”);
}catch(filenotfounde异常){
e、 printStackTrace();
}
断言输出!=null;
map.entrySet().forEach(输出::println);
output.close();
}
方法B:

    private static void parse(Map<Set<String>, Integer> map) {

        PrintWriter output = null;
        try {
            output = new PrintWriter("output2.csv");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        assert output != null;
        map.entrySet().forEach(output::println);
        output.close();
    }
私有静态无效解析(映射){
PrintWriter输出=null;
试一试{
输出=新的PrintWriter(“output2.csv”);
}catch(filenotfounde异常){
e、 printStackTrace();
}
断言输出!=null;
map.entrySet().forEach(输出::println);
output.close();
}
我总是可以用不同的名称为它们创建两个不同的方法,但这会使我的代码看起来不必要的冗长和不可靠,所以我试图避免它


我做错了什么?请告诉我。

您可以使用不同的参数、不同数量的参数和不同类型的参数重载方法。在您的示例代码中,Java将两个方法视为相同的,因为它们具有相同的输入参数,即Map,您可以在其中一个方法中添加另一个参数以使它们工作。

这是因为Java中的类型擦除。基本上,编译后,代码将如下所示

private static void parse(Map map) {
}

private static void parse(Map map) {
}
看看代码。为什么不这样做方法签名呢

private static void parse(Map<?, ?> map, String fileName) {
}
private静态空解析(映射映射,字符串文件名){
}

这样,您还可以避免不必要的过载。

是的,您可以。它们都是相同的,而且,使用参数的单个语句是map.entrySet(),它是


因此,您只需使用接口映射,下面是一个如何在映射上实现generis的示例,这是不可能的,因为这两种方法具有相同的类型签名。如中所述,在Java编程语言中,方法签名是方法名称及其参数的数量、类型和顺序。返回类型和抛出异常不被认为是方法签名的一部分。

< p> java泛型使用类型擦除,意味着泛型参数类型不被编译器考虑。在类型擦除之后,编译器认为这两个方法具有相同的方法签名

private static void parse(Map<String, Long> map)   --> parse(Map map)
private static void parse(Map<Set<String>, Integer> map) -->  parse(Map map)
private static void parse(映射)-->parse(映射)
私有静态void解析(映射)-->parse(映射)
这两个方法不能重载,最好更改方法名称,或者通过提供额外参数为两个文件使用单个方法


有关更多详细信息,请参阅:

实际上,您的方法具有相同的方法签名。 像

//私有静态无效解析(映射)
私有静态void解析(映射)
//私有静态void解析(映射)
私有静态void解析(映射)

但即使地图的数据类型不同,它仍然不算数?如果这是真的,我会发现这真的很奇怪。如果我能进一步解释为什么会这样,那就太好了。重载发生在编译时,它是静态的,编译器通过输入参数的签名来决定使用哪个方法,对于相同的参数签名,它在这里映射,它将生成错误。
// private static void parse(Map<String, Long> map)
private static void parse(Map<K,V> map)

// private static void parse(Map<Set<String>, Integer> map)
private static void parse(Map<K,V> map)