美文网首页
泛型 - 通配符与嵌套

泛型 - 通配符与嵌套

作者: 耀恒 | 来源:发表于2019-12-25 15:28 被阅读0次
image

通配符与嵌套

通配符

为什么使用通配符,比如有个打印方法根据Key打印Value如下示例,在使用showKeyValue1()方法打印不是String类型的泛型时编译器就会报错。(注:Generic为泛型类)

// 主方法
public static void main(String[] str){
    // Ingeter类型泛型对象
    Generic<Ingeter> obj1 = new Generic<Ingeter>;
    // String类型泛型对象
    Generic<String> obj2 = new Generic<String>;
    
    // 打印Ingeter类型泛型
    // 这个方法编译器会报错:Generic<java.lang.Integer> cannot be applied to Generic<java.lang.Number>
    showKeyValue1(obj1);
    // 打印String类型泛型
    showKeyValue1(obj2);
    
    // 因showKeyValue1方法的局限性,导致在传入未知类型时编译器报错
    // 由此类型通配符应运而生,如Object是所有类的父类,这里'?'是所有泛型的父类一样
    showKeyValue2(obj1);
    showKeyValue2(obj2);
}

// 打印方法1
public void showKeyValue1(Generic<String> obj){
    Log.d("泛型测试", "key:" + obj.getKey);
}

// 打印方法2
public void showKeyValue2(Generic<?> obj){
    Log.d("泛型测试", "key:" + obj.getKey);
}

类型通配符一般是使用'?'代替具体的类型实参,'?'是类型实参,而不是类型形参 。直白点的意思就是,'?'和String、Integer一样都是一种实际的类型,可以把'?'看成所有类型的父类。是一种真实的类型。

可以解决当具体类型不确定的时候,这个通配符就是'?' ;当操作类型时,不需要使用类型的具体功能时,只使用Object类中的功能。那么可以用'?' 通配符来表未知类型。

嵌套

什么是泛型嵌套,通过如下示例理解:(家庭)

// 家庭
public class Family<T> {
    // 成员
    private Map<String, T> members = new HashMap<>();
    // 设置
    public addMember(String name, T t){
        if (t != null) {
            members.put(name, t);
        }
    }
    // 获取
    public T getMember(String name){
        return members.get(name);
    }
}
// 成员
public class Member<E> {
    // 性别
    private E sex;
    // 设置
    public void setSex(E e){
        this.sex = e
    }
    // 获取
    public E getSex(){
        return sex;
    }
}
// 性别
public class Sex { }
// 性别男
public class Male extends Sex {
    //  具有的特征
    ...
}
// 性别女
public class Girl extends Sex {
    // 具有的特征
    ...
}

public static void main(String[] strs) {
    // 家庭成员1
    Member<Male> member1 = new Member<Male>();
    // 家庭成员2
    Member<Girl> member2 = new Member<Girl>();
    // 家庭
    Family<Member<Sex>> family = new Family<Member<Sex>>();
    // 添加成员
    family.addMember("张三", member1);
    family.addMember("李四", member2);
}

如下示例

    // HashMap
    Map<String,String> map = new HashMap<String,String>();
    map.put("a", "老大");
    map.put("b", "老二");
        
    Set<Entry<String, String>> entrySet = map.entrySet();
    for (Entry<String, String> entry : entrySet) {
        System.out.println(entry.getKey() +"--->"+ entry.getValue());
    }

相关文章

  • 【泛型】泛型上下边界

    上一篇 【泛型】通配符与嵌套通配符可以是任意类类型,在实际业务中使用通配符时,可能会遇到很多安全问题,如传入的泛型...

  • 最强整理:一线互联网移动架构师筑基必备技能之Java篇

    移动架构师筑基必备技能 一、深入Java泛型 泛型的作用与定义通配符与嵌套泛型上下边界RxJava中泛型的使用分析...

  • 泛型 - 通配符与嵌套

    通配符与嵌套 通配符 为什么使用通配符,比如有个打印方法根据Key打印Value如下示例,在使用showKeyVa...

  • 【泛型】通配符与嵌套

    上一篇 【泛型】泛型的作用与定义 1 泛型分类 泛型可以分成泛型类、泛型方法和泛型接口 1.1 泛型类 一个泛型类...

  • 泛型

    普通类的多态 对泛型,是没有多态的 利用通配符,可以实现上面想实现的功能 泛型的嵌套 没有泛型数组,用通配符可以去...

  • Java泛型

    1. 泛型通配符与PECS 为什么要使用泛型通配符和边界 List泛型转换需要用到通配符 ? “装A的List” ...

  • Java 泛型

    泛型类 例如 泛型接口 例如 泛型通配符 泛型方法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型上下边...

  • 深入Java泛型,通配符与嵌套

    上一节: 架构师筑基必备技能:深入Java泛型,泛型的作用与定义 本文作者:我俩绝配本文出处:博客园原文链接:ht...

  • Android 学习(一):Java 泛型

    Java泛型学习 1.0 泛型常用案例 2.0 泛型方法 3.0 泛型类 4.0 通配符 ? 通配符,占位符,标识...

  • Kotlin泛型方法

    泛型约束 泛型通配符

网友评论

      本文标题:泛型 - 通配符与嵌套

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