• 如何查看调用的Java的抽象接口泛型类的参数类型


    问题:

    LambdaQueryWrapper<Integer> c = new LambdaQueryWrapper<>();

    想知道  c.gt 的第一个泛型参数类型 R 是什么?

    结论:

    gt 是接口 compare 的function,找到 compare 和 lambdaQueryWrapper 的实现链路,肯定有一个地方在 implement compare 的时候,或者 继承 compare 的实现类的时候,指定了 compare的实现类的泛型 R   

    而这里是 AbstractLambdaWrapper 在继承 AbstractWrapper(compare的实现类的继承类)的时候,指定了 AbstractWrapper 的泛型类,从而指定了 R 的类型是 String 

    同时观察很明显的、复习一下:

    Java 可以同时 implement 多个 interface ;

    而Java子类只能够继承一个父类,存在单继承局限;

    如果想到多重继承 不能直接  C extend A,B 但是可以

    class A {}
    class B extends A {}
    class C extends B {}

    实例代码:

    package com.example.one.utils;
    
    // 定义了泛型,相当于在class的名称后面<>括号内部定义2个形参
    // 这两个形参就是修饰符,可以传递任意java Type定义这个class里面的具体类
    
    
    // Compare 被抽象类 AbstractWrapper 实现 \  AbstractWrapper又被 AbstractLambdaWrapper 继承 \ LambdaQueryWrapper又继承了 AbstractLambdaWrapper
    // 继承的链路  AbstractWrapper > AbstractLambdaWrapper > LambdaQueryWrapper
    // 相当于 Compare 有了 3个 实现
    
    
    // 最终我使用Query类库的时候使用了 LambdaQueryWrapper 的实例
    // 而LambdaQueryWrapper在定义的时候定义了AbstractWrapper的第二个java Type是String
    // 相当于Compare的泛型第二个类型的R是String
    
    public interface Compare<Children, R> {
    
        /**
         * ignore
         */
        default Children gt(R column, Object val) {
            return gt(true, column, val);
        }
    
        /**
         * 大于 &gt;
         *
         * @param condition 执行条件
         * @param column 字段
         * @param val 值
         * @return children
         */
        Children gt(boolean condition, R column, Object val);
    }

    这个interface的实现:

    抽象类实现:

    package com.example.one.utils;
    
    // AbstractWrapper 继承了 Wrapper
    // 其中 Wrapper 实现了 Compare 和 Join
    public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T, R, Children>> extends Wrapper<T>
            implements Compare<Children, R>, Join<Children> {
    }

    抽象类的继承的实现:

    package com.example.one.utils;
    
    
    public class LambdaQueryWrapper<T> extends AbstractLambdaWrapper<T, LambdaQueryWrapper<T>>
            implements Query<LambdaQueryWrapper<T>, T, String> {
    
    
        @Override
        public LambdaQueryWrapper<T> gt(String column, Object val) {
            return super.gt(column, val);
        }
    
        @Override
        public LambdaQueryWrapper<T> gt(boolean condition, String column, Object val) {
            return null;
        }
    
        public static void main(String[] args) {
            LambdaQueryWrapper<Integer> c = new LambdaQueryWrapper<>();
            c.gt("name", 1);
        }
    }

    Query 

    package com.example.one.utils;
    
    import java.io.Serializable;
    
    public interface Query<Children, T, R> extends Serializable {
    }
    package com.example.one.utils;
    
    // AbstractLambdaWrapper 继承了 AbstractWrapper
    public abstract class AbstractLambdaWrapper<T, Children extends AbstractLambdaWrapper<T, Children>>
            extends AbstractWrapper<T, String, Children> {
    
    }
    AbstractLambdaWrapper 在继承 AbstractWrapper 指定第二个R泛型类库是String 所以 ,
    AbstractWrapper的继承 AbstractLambdaWrapper 的继承 LambdaQueryWrapper (同时 LambdaQueryWrapper 也是 Query 的实现 )

    最终使用查询构造器 LambdaQueryWrapper 的时候,gt 的形参类型 是 String
    // Compare 被抽象类 AbstractWrapper 实现 \  AbstractWrapper又被 AbstractLambdaWrapper 继承 \ LambdaQueryWrapper又继承了 AbstractLambdaWrapper

    // 继承的链路 AbstractWrapper > AbstractLambdaWrapper > LambdaQueryWrapper

    // 相当于 Compare 有了 3个 实现


  • 相关阅读:
    Android开发使用的常见第三方框架汇总
    15 个 Android 通用流行框架大全(归类)
    android布局属性大全
    Android 开源项目分类汇总
    有哪些 Android 大牛的 blog 值得推荐?
    Android Activity 知识点全面总结
    android知识点大总结
    自动生成fbi代码网站
    androidstudio 快捷键设置以及导入快捷键模版
    Android Studio调背景颜色
  • 原文地址:https://www.cnblogs.com/xuweiqiang/p/16202454.html
Copyright © 2020-2023  润新知