java - 从函数中获取通用类型

标签 java reflection lambda java-8

<分区>

我想获得 java.util.function.Function 的结果类型。 (如果返回类型已经是 Optional 那么我不需要做任何事情,否则我必须将它包装在 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。 对于第二个,这使用 getGenericSuperClass() + ParameterizedType 有效,但对其他两个无效?我做错了什么?

Java 版本“1.8.0_51”

最佳答案

你没有做错任何事情(关于 getGenericInterfaces)。

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

对于为方法引用产生的实例生成的动态“代理”类,情况并非如此。推断出的泛型类型参数不会保留在最终生成实例的字节码中。

关于java - 从函数中获取通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34010203/

相关文章:

Java:我无法更改 JButton 的背景

java - JSTL - 将列表内容分配到数组中

python - 在 Python 3.2 中, "lambda"是否被视为 "keyword,"和 "operator"或两者?

javascript - 揭秘 JQuery 插件

lambda - 统计一个字母在列表中出现的次数

java - 为什么 JPA 元模型中的所有字段均为空?

c# - 使用反射从复杂类中获取值

Java 类作为变量

c# - 给定一个类型对象,为什么我需要使用反射来实例化一个泛型?

java - 加密 key 大小 DES Java