为什么我在这种情况下需要演员?

时间:2011-09-28 15:50:34

标签: java generics

如果我定义了一个方法。

public static <T> T getSomeTea(Class<T> returnType) {
   //do stuff and return a T
}

public static <T> T getSomeSpecialTea(T someVal) {
   T someTea = (T) getSomeTea(someVal.getClass());
}

在getSomeSpecialTea中,为什么我需要从getSomeTea转换返回值。在我看来演员是不必要的,但也许我错过了一些重要的东西。

2 个答案:

答案 0 :(得分:4)

Object.getClass()不是通用的,因此您的代码是有效的:

public static <T> T getSomeSpecialTea(T someVal) {
   Class<?> clazz = someVal.getClass();
   T someTea = (T) getSomeTea(clazz);
}

那时你为什么需要演员更清楚? (当然,并不是演员在执行时会发生任何事情......)你并没有有效地调用<T>getSomeTea()这是你真正想要的。

这只是Java泛型的另一个例子,有点痛苦:(

答案 1 :(得分:1)

getClass()返回类型的不幸删除会让很多人感到不安。

您可以使用返回未删除类型的实用程序方法

public static <T> Class<? extends T> myGetClass(T instance)
    return (Class<? extends T>)instance.getClass();

public static <T> T getSomeSpecialTea(T someVal) 
   T someTea = getSomeTea( myGetClass(someVal) );