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){}中间版本?
简而言之,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<?>是泛型类型的所有实例化的抽象超类型.
另见