I would like to get the result type of a java.util.function.Function. (If the return type is already Optional then I don't have to do anything, but otherwise I have to wrap it in Optionals and for obvious reasons I don't want to wrap it twice.
Here is my example code:
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();
}
I get this as result:
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
but actually I would like get java.lang.Integer or java.util.Optional from the method. For second one this works using get getGenericSuperClass() + ParameterizedType, but not for the other two? What am I doing wrong?
java version "1.8.0_51"
 
Aucun commentaire:
Enregistrer un commentaire