泛型与lambda表达式

吕檀溪 发布于 2018/09/06 13:15
阅读 733
收藏 0
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.function.Consumer;


public class User {

    private <T> void test(Consumer<T> request) {
        Type[] interfaces = request.getClass().getGenericInterfaces();
        for (Type type : interfaces) {
            if (type instanceof ParameterizedType) {
                Type actualType = ((ParameterizedType) type).getActualTypeArguments()[0];
                if (actualType instanceof Class) {
                    System.out.println(actualType);
                    return;
                }
            }
        }
        System.out.println("没有获取到泛型");
    }


    public static void main(String[] args) {
  
        new User().test((Consumer<Integer>) integer -> {

        });
        new User().test(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) {

            }
        });
    }
}

在main使用了 lambda表达式调用和普通调用,在User.test中获取Consumer的泛型,在使用lambda表达式的时候无法获取,不同调用却可以。我应该修改来支持lambda呢?主要是我想获取传进来的Consumer的泛型,不管是不是用的lambda方式,求指教

加载中
1
yongk
yongk

帮你查了一下,两步解决。

1. 添加依赖项

<dependency>
    <groupId>net.jodah</groupId>
    <artifactId>typetools</artifactId>
    <version>0.5.0</version>
</dependency>

2.修改test方法为

private <T> void test(Consumer<T> request) {
    Class<?>[] typeArgs = TypeResolver.resolveRawArguments(Consumer.class, request.getClass());
    if (typeArgs.length == 1) {
        System.out.println(typeArgs[0]);
        return;
    }
    System.out.println("没有获取到泛型");
}

参考:

https://stackoverflow.com/questions/23863716/java-how-to-resolve-generic-type-of-lambda-parameter#27364346

返回顶部
顶部