调用中间泛型方法时如何保留类类型

时间:2016-01-17 09:49:58

标签: java class generics types

我有一个调用泛型方法的方法,该方法针对特殊行为的某些类型实例化:

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 个答案:

答案 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);
}