美文网首页Android进阶之路Android开发经验谈Android开发
Lambda表达式代替匿名内部类时无法获取接口泛型类型问题

Lambda表达式代替匿名内部类时无法获取接口泛型类型问题

作者: VinPin | 来源:发表于2019-06-25 14:53 被阅读7次

假设有一个泛型接口Callback和一个JavaBean类:

    public class JavaBean {
        public String name;
    }

    public interface Callback<T> {

        void onSucess(T t);
    }

再来一个测试方法test()用于获取参数callback的泛型类型

class TestDemo {

    private <T> void test(Callback<T> callback) {
        Type type = getTypeFromInterface(callback);
        if (type != null) {
            System.out.println(type.getTypeName());
        } else {
            System.out.println("未指定泛型");
        }
    }

    private <T> Type getTypeFromInterface(Callback<T> callBack) {
        try {
            Type[] interfaceTypes = callBack.getClass().getGenericInterfaces();
            Type type;
            if (interfaceTypes.length == 0) {
                //非接口
                type = callBack.getClass().getGenericSuperclass();
            } else {
                type = interfaceTypes[0];
            }
            if (type == null) {
                return null;
            }
            if (ParameterizedType.class.isAssignableFrom(type.getClass())) {
                return (((ParameterizedType) type).getActualTypeArguments())[0];
            }
        } catch (Exception e) {
            return null;
        }
        return null;
    }

}

正常调用test方法,是用匿名内部类的方式:

    public static void main(String[] args) {
        TestDemo demo = new TestDemo();
        // 匿名内部类
        demo.test(new Callback<String>() {
            @Override
            public void onSucess(String o) {

            }
        });
        demo.test(new Callback<JavaBean>() {
            @Override
            public void onSucess(JavaBean o) {

            }
        });
        demo.test(new Callback<List<JavaBean>>() {
            @Override
            public void onSucess(List<JavaBean> o) {

            }
        });
    }

运行查看输出如下:

java.lang.String
***.***.JavaBean
java.util.List<***.***.JavaBean>

说明这样能够获取泛型类型。但是这种匿名内部类的方式开发工具会提示用lambda代替。

    public static void main(String[] args) {
        TestDemo demo = new TestDemo();
        // lambda表达式
        demo.test((Callback<String>) s -> {
        });
        demo.test((Callback<JavaBean>) s -> {
        });
        demo.test((Callback<List<JavaBean>>) s -> {
        });
    }

然后再运行下,查看输出,居然获取不到泛型类型!!!

未指定泛型
未指定泛型
未指定泛型

请问各位大佬,这是为什么呢?如果想用lambda表达式那要怎么获取接口的泛型类型呢?

相关文章

  • Lambda表达式代替匿名内部类时无法获取接口泛型类型问题

    假设有一个泛型接口Callback和一个JavaBean类: 再来一个测试方法test()用于获取参数callba...

  • Lambda表达式-03-02

    外部类实现线程接口: 内部类实现线程接口: 匿名内部类: jdk8的Lambda表达式:

  • Day12_22

    容器--Map(键值对) 最具逼格的冒泡排序 lambda表达式,匿名内部类的使用 泛型的使用

  • Java 8新特性

    Lambda表达式与Functional接口 Lambda表达式 可以认为是一种特殊的匿名内部类lambda只能用...

  • Lambda表达式

    1. Lambda简介 Lambda 表达式是 JDK8 的新特性,使用Lambda语法来代替匿名的内部类,代码不...

  • Java 函数式编程技能清单

    首先,了解匿名内部类,函数式接口1、熟练使用Lambda表达式编程掌握Lambda表达式编写方法,方法引用,默认方...

  • Java 8 新特性 Lambda 表达式简单使用

    Lambda 表达式主要应用在一个方法需要带一个接口类型,而且接口只有一个抽象方法时,在创建匿名内部类时一些固定的...

  • 2020Android面试学习

    Java String 有多长? 匿名内部类 泛型 获取泛型 onActivityResult使用很麻烦,为什么不...

  • Kotlin之Lambda表达式和成员引用

    Lambda介绍:作为函数参数的代码块 用匿名内部类实现监听器 现在用Kotlin的Lambda表达式来替换匿名内...

  • Java8 Lambda表达式

    1.替代匿名内部类 使用匿名内部类 使用lambda表达式 2.使用lambda表达式对集合进行迭代 3.使用la...

网友评论

    本文标题:Lambda表达式代替匿名内部类时无法获取接口泛型类型问题

    本文链接:https://www.haomeiwen.com/subject/qfwtcctx.html