在Java中重载方法

Tin*_*iny 4 java oop overloading

在以下代码段中,有三个版本的方法命名show().

package overloading;

import java.util.ArrayList;
import java.util.List;

public final class Main
{
    private void show(Object object)
    {
        System.out.println("Object");
    }

    private void show(List<Object> list)  //Unused method
    {
        System.out.println("List");
    }

    private void show(Object[] objects)
    {
        System.out.println("Objects");
    }

    private void addToList()
    {
        List<String>list=new ArrayList<String>();
        list.add("String1");
        list.add("String2");
        list.add("String3");
        show(list); // Invokes the first version

        String []s={"111", "222", "333"};
        show(s);   // Invokes the last version
    }

    public static void main(String[] args)
    {
        new Main().addToList();
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个最简单的Java代码中,此方法调用show(s);(方法中的最后一行addToList())调用重载方法的最后一个版本.它提供了一个字符串数组 - String[]它被接收参数类型接受Object[].

show(list);但是,此函数调用尝试调用重载方法的第一个版本.它传递一个类型字符串列表 - List<String>应该由接收参数类型List<Object>的中间版本接受.方法的中间版本是完全未使用的.如果删除了第一个版本,则是编译时错误.

为什么这个调用show(list); 没有调用这个版本 - private void show(List<Object> list){}中间版本?

Xia*_*Jia 7

简而言之,List<Object>不是List<String>.

要"修复"您的代码,请使用以下代码

private void show(List<? extends Object> list)
{
    System.out.println("List");
}
Run Code Online (Sandbox Code Playgroud)

与数组(在Java中是协变的)不同,泛型类型的不同实例化彼此不兼容,甚至不是显式的.

随着声明Generic<Supertype> superGeneric; Generic<Subtype> subGeneric; 的编译器将报告两个铸件转换错误(Generic<Subtype>)superGeneric(Generic<Supertype>)subGeneric.

如果用作实际类型参数,则通配符可以软化此不兼容性?:Generic<?>是泛型类型的所有实例化的抽象超类型.