【发布时间】:2021-02-19 06:00:29
【问题描述】:
Java 类不能有两个在类型擦除后具有相同签名的重载方法。 Java 将针对以下情况生成编译时错误:
public class Example {
public void print(Set<String> strSet) { }
public void print(Set<Integer> intSet) { }
}
但我的问题不是那个。有两种情况1和2。我想知道,为什么他们的行为不一样?
Scenario 1:
import java.util.ArrayList;
import java.util.List;
public class MethodOverload {
public static void main(String[] args) {
MethodOverload methodOverload = new MethodOverload();
//Point 1 - List here
List<Integer> mangoList = new ArrayList<Integer>();
mangoList.add(1);
mangoList.add(2);
System.out.println("Size List<Integer>:"+methodOverload.count(mangoList));
//Point 2 - ArrayList here
ArrayList<String> nameList = new ArrayList<String>();
nameList.add("Anex");
nameList.add("Alia");
nameList.add("Maxim");
System.out.println("Size List<String>:"+methodOverload.count(nameList));
}
public <T> int count(List<T> list) {
System.out.print("Ïn side generic; ");
return list.size();
}
}
场景 1 的输出:
Inside generic block; Size List<Integer> : 2
Inside generic block; Size List<String> : 3
Scenario 2:
import java.util.ArrayList;
import java.util.List;
public class MethodOverload {
public static void main(String[] args) {
MethodOverload methodOverload = new MethodOverload();
//Point 3 - List here
List<Integer> mangoList = new ArrayList<Integer>();
mangoList.add(1);
mangoList.add(2);
System.out.println("Size List<Integer>:"+methodOverload.count(mangoList));
//Point 4 - ArrayList here
ArrayList<String> nameList = new ArrayList<String>();
nameList.add("Anex");
nameList.add("Alia");
nameList.add("Maxim");
System.out.println("Size List<String>:"+methodOverload.count(nameList));
}
public <T> int count(List<T> list) {
System.out.print("Inside generic block; ");
return list.size();
}
//Point 5
public int count(ArrayList<String> list) {
System.out.print("Inside non-generic block; ");
return list.size();
}
}
场景 2 的输出:
Inside generic block; Size List<Integer> : 2
Inside non-generic block; Size List<String> : 3
现在,我的问题是,在scenario 2 的情况下,java 如何决定调用哪个方法?
在scenario 1 中,java 调用单个计数方法没有任何问题,那么为什么 java 没有为scenario 2 显示类似的行为?
【问题讨论】:
标签: java generics overloading