从函数中获取泛型类型

时间:2015-11-30 23:52:24

标签: java reflection lambda java-8

我想获得java.util.function.Function的结果类型。 (如果返回类型已经是可选的,那么我不需要做任何事情,但是否则我必须将它包装在Optionals中,并且出于显而易见的原因我不想将它包装两次。

这是我的示例代码:

public static void main(String[] args) {
    printType(Integer::parse);
    printType(new Foo());
    printType(Functions::tryParseInt);
}

public static void printType(Function<String, ?> function) {
    System.out.println(function.getClass());
    System.out.println(function.getClass().getGenericInterfaces()[0]);
    if (!returnsOptional(function)) function = function.then(Optional::ofNullable);
    [...]
}

private static class Foo implements Function<String, Integer> {
    @Override
    public Integer apply(String t) {
        return Integer.parse(t);
    }

}

public static Optional<Integer> tryParseInt(String a) {
    return Optional.empty();
}

我得到了这个结果:

class my.util.Functions$$Lambda$1/1705736037
interface java.util.function.Function
class my.util.Functions$Foo
java.util.function.Function<java.lang.String, java.lang.Integer>
class my.util.Functions$$Lambda$3/764977973
interface java.util.function.Function

但实际上我想得到 方法中的java.lang.Integer或java.util.Optional。 对于第二个,这使用get getGenericSuperClass()+ ParameterizedType,但不适用于其他两个?我做错了什么?

java版“1.8.0_51”

1 个答案:

答案 0 :(得分:1)

你没有做错任何事(关于find /path/to/files -type d -name '.git' -exec dirname {} + )。

getGenericInterfaces在其声明中包含其完整类型信息。它可用于相应的Foo对象。

对于由方法引用产生的实例生成的动态“代理”类,不能说同样的情况。推断的泛型类型参数不保存在最终生成实例的字节码中。