美文网首页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表达式代替匿名内部类时无法获取接口泛型类型问题

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