2016-01-17 61 views
1

时保留类类型我有一个调用一个泛型方法,它被实例化对于某些类型的特殊行为的方法:如何调用中间泛型方法

public static void generic_direct(String s) 
{ 
System.out.println("YOU SUBMIT STRING: premium class"); 
} 

public static <T> void generic_direct(T t) 
{ 
System.out.println("YOU SUBMIT GENERIC: second class"); 
} 


System.out.println("TEST STRING ?"); 
generic_direct("what ?"); 
System.out.println("TEST INTEGER ?"); 
generic_direct(12345); 

给出期望的行为:

TEST STRING ? 
YOU SUBMIT STRING: premium class 
TEST INTEGER ? 
YOU SUBMIT GENERIC: second class 

但是当它通过另一种通用方法调用时,您将丢失班级类型

public static <T> void generic_indirect(T t) 
{ 
generic_direct(t); 
} 

System.out.println("TEST STRING ?"); 
generic_indirect("what ?"); 
System.out.println("TEST INTEGER ?"); 
generic_indirect(12345); 

给这个:

TEST STRING ? 
YOU SUBMIT GENERIC: second class 
TEST INTEGER ? 
YOU SUBMIT GENERIC: second class 

因此,它是可能的,以及如何保护类的类型,当使用中间的通用方法,而不必实例化可能的类型每个中间的方法?

回答

1

通过使用generic_indirect(T)你失去类型安全的方法,因为Java编译器将取代通用型牛逼使用对象。据我所知,这没有解决方法。你可以找到更多关于类型擦除here

编译后的代码会是这个样子:

public static void generic_direct(String s) 
{ 
System.out.println("YOU SUBMIT STRING: premium class"); 
} 

public static void generic_direct(Object t) 
{ 
System.out.println("YOU SUBMIT GENERIC: second class"); 
} 
public static void generic_indirect(Object t) 
{ 
// will resolve it to generic_direct(Object) 
generic_direct(t); 
} 
+0

是的,谢谢,我知道,但问题是不是原因,而是如何管理。任何诡计! –

+0

没有我所知道的。正如我所看到的,您要么实现类型特定的generic_indirect(String),要么增强generic_indirect(T)来检查参数的实例并将其转换为相应的类型(在本例中为String)。 –