Java使用type erasure这意味着在编译时删除与泛型有关的类型信息。
因此在运行时无法从Function<T, String>
获得T
型号。
中的代码片断,你有,你可以这样做:
public abstract class AbstractFunction<T>
{
private Function<T, String> function;
...
public Class<T> getInputType() throws ClassNotFoundException
{
return (Class<T>)Class.forName(((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0].getTypeName());
}
}
public IntegerFunction extends AbstractFunction<Integer>
{
}
虽然都非常调皮,则恕我直言不必要的复杂性,并且可以简化为:
public abstract class AbstractFunction<T>
{
private Function<T, String> function;
...
public abstract Class<T> getInputType();
}
public IntegerFunction extends AbstractFunction<Integer>
{
@Override
public Class<Integer> getInputType()
{
return Integer.class;
}
}
这仍然引入了一个毫无意义的课程,可以进一步降低到:
public class MyFunction<T>
{
private Class<T> inputType;
private Function<T, String> function;
public MyFunction(Class<T> inputType, Function<T, String> function)
{
this.inputType = inputType;
this.function = function;
}
public Class<T> getInputType()
{
return inputType;
}
}
所有这一切说,需要知道泛型类型是一个code-smell位,并可能表明在你的设计中还有一些不太正确的东西。
这个变量是一个泛型类型的字段吗?泛型函数中的'函数'与非泛型类型中的'函数<整数,字符串>'有很大区别。一个简短但完整的例子在这里真的很有帮助。 (你所要求的可能是可能的,但它可能不会......) –
并且注意,如果'x'的值是非零值,那么只能从'x.getClass()'获得'Integer.class'。空值。 –
@JonSkeet:我可以安全地假设实例变量是非空的 – user34812