我有一个调用泛型方法的方法,该方法针对特殊行为的某些类型实例化:
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
当使用中间泛型方法时,是否有可能以及如何保留类类型,而不必使用可能的类型实例化每个中间方法?
答案 0 :(得分:1)
通过使用 generic_indirect(T)方法,您将失去类型安全性,因为Java编译器将使用Object替换泛型类型 T 。据我所知,没有解决方法。您可以找到有关类型擦除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);
}