深入Java泛型二通配符与嵌套

Posted 持续学习刻意练习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入Java泛型二通配符与嵌套相关的知识,希望对你有一定的参考价值。

第一章深入Java泛型

二、通配符与嵌套

2.1 通配符

?:表示类型不确定,只能用于声明变量或者形参上,不能用在创建泛型类、泛型方法和接口上。

public static void main(String[] args) 
    List<?> list = new ArrayList<Integer>();
    list = new ArrayList<String>();
    test(list);


public static void test(List<?> list) 

? 号通配符表示可以匹配任意类型,任意的 Java 类都可以匹配。

在使用 ? 号通配符的时候:只能调用对象与类型无关的方法,不能调用对象与类型有关的方法。

2.2 泛型嵌套

定义两个泛型类,Myclass 类的泛型就是 student 类,而 student 类的发逆行是 String 类。

class Student<T> 
    private T score;
    
    public T getScore() 
        return score;
    

    public void setScore(T score) 
        this.score = score;
    


class MyClass<T> 
    private T cls;


    public T getCls() 
        return cls;
    


    public void setCls(T cls) 
        this.cls = cls;
    


public static void main(String[] args) 
    Student<String> stu = new String<String>();
    stu.setScore("great");
    // 嵌套泛型
    MyClass<Student<String>> cls = new MyClass<Student<String>>();
    cls.setCls(stu);
    Student<String> stu2 = new Student<String>();
    stu2 = cls.getCls();
    System.out.println(stu2.getScore());// great

如上就实现了泛型的嵌套,在 HashMap 中对键值对进行遍历的时候,也利用了泛型的嵌套。

public static void main(String[] args) 
    Map<String, String> map = new HashMap<>(String, String);
    map.put("a", "java300");
    map.put("b", "马士兵javase");

    Set<Entry<String, String>> entrySet = map.entrySet();
    for(Entry<String, String> entry: entrySet) 
        String key = entry.getKey();
        String value = entry.getValue();
    

2.3 通配符和泛型方法

大多时候,我们都可以使用泛型方法来代替通配符的。

// 使用通配符
public static void test(List<?> list) 

// 使用泛型方法
public <T> void test2(List<T> t)

上面这两个方法都是可以的,那么问题来了,我们使用通配符还是使用泛型方法呢?

原则:

  • 如果参数之间的类型有依赖关系,或者返回值是与参数之间有依赖关系的,就使用泛型方法
  • 如果没有依赖关系的,使用通配符,通配符会更灵活一些

以上是关于深入Java泛型二通配符与嵌套的主要内容,如果未能解决你的问题,请参考以下文章

Java泛型——使用Gson解析复杂的泛型嵌套泛型数据结构

第六节:Java泛型

深入理解Java泛型协变逆变泛型通配符自限定

java泛型---通配符,泛型嵌套

夯实Java基础系列13:深入理解Java中的泛型

JAVA设计模式学习顺序,请高手指点!