我想获得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”
答案 0 :(得分:1)
你没有做错任何事(关于find /path/to/files -type d -name '.git' -exec dirname {} +
)。
类getGenericInterfaces
在其声明中包含其完整类型信息。它可用于相应的Foo
对象。
对于由方法引用产生的实例生成的动态“代理”类,不能说同样的情况。推断的泛型类型参数不保存在最终生成实例的字节码中。