fo_*_*x86 9 java generics types
我从Joshua Bloch给出的谷歌I/O益智游戏中得到了这个.这是代码
public class Glommer<T> {
String glom(Collection<?> obj){
String result = "";
for(Object o : obj){
result += o;
}
return result;
}
int glom(List<Integer> ints){
int result = 0;
for(int i : ints){
result += i;
}
return result;
}
public static void main(String args[]){
List<String> strings = Arrays.asList("1", "2", "3");
System.out.println(new Glommer().glom(strings));
}
Run Code Online (Sandbox Code Playgroud)
这个main方法抛出一个异常,因为它new Glommer是一个原始类型,因此所有的泛型都Glommer被删除了,所以最终调用int glom(List<Integer> ints)而不是String glom(Collection<?> obj).
我的问题是,即使我打电话glom()是new Glommer<Integer>().glom(strings)不是应该把它调用的int glom(List<Integer> ints)方法,因为由于类型擦除,这种方法是有效的int glom(List ints)并且strings是类型的List不是Collection?
被调用的方法是在编译时定义的,而不是在运行时定义的.
如果向构造函数调用添加参数,编译器将有足够的信息知道它必须调用第一个方法.否则,就好像仿制药不存在一样.在这两种情况下,被调用的方法在运行时将始终保持不变.
编辑有些人似乎有疑问,所以这是另一个例子:
public class Test {
private static void test(Object object) {
System.out.println("Object method");
}
private static void test(Integer integer) {
System.out.println("Integer method");
}
public static void main(String[] args) {
Object object = Integer.valueOf(0);
test(object);
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
Object method
Run Code Online (Sandbox Code Playgroud)
您将Integer传递给您的方法,但编译器在编译时知道的所有内容都是它是一个对象.即使Object实际上是一个Integer,jvm也不会自动更改方法调用.