2016-05-12 76 views
0

输出始终为In OBJECT。因为返回类型在所有情况下都是无效的。
但为什么它不会去m1(Integer s)?如果没有类型转换,可以将呼叫转到m1(Integer s)?了解java通用方法

package test; 

public class test_class { 

public static void m1(Integer s){ 
    System.out.println("IN INT"); 
} 

public static void m1(Object s){ 
    System.out.println("IN OBJECT");   
} 

public static <Integer> void m2(Integer t){ 
    m1(t); 
} 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    test_class.m2(12); 
} 

} 
+1

您认为''在'public static void'中有什么作用?你为什么这么认为? –

+0

- >这不应该告诉编译器调用接受'Integer'的m1吗?因为Integer是Object的子类(可能),我可以理解为什么调用去Object,但是如果我删除m1(Object s),代码不会编译。 – akash12300

+0

这是一个方法声明。它什么都不叫。你是否了解了泛型方法,以及它们如何声明泛型类型参数? –

回答

1

我似乎不明白泛型是如何工作的,你以某种方式将它与超载混合在一起。如果你声明了一个通用方法,那么类型参数(在你的情况下为Integer)是一个变量(通常为T)。在你的情况下,类型参数被称为Integer,它以某种方式干涉/遮蔽了参数的类型。

只是删除从m2<Integer>,你会得到预期的结果。

+0

除此之外,您还可以投射变量来控制正确方法的执行,例如, 'Test.m2((Integer)Integer.valueOf(12));'或'Test.m2((Object)Integer.valueOf(12));'。该技术称为多态。 –

+0

我试过了。但它仍然是m1(对象s),但是如果我将它转换为m2的定义内的整数,那么它就可以工作。 – akash12300