集合框架(03)泛型

 泛型:JDK1.5版本之后出现的新特性,用于解决安全问题,是一个安全机制

好处:

  1. 将运行时期出现的问题ClassCastException(类转换异常),转移到了编译时期,方便于程序员解决问题,让运行时问题减少,安全。
  2. 避免了强制转化的麻烦

泛型格式:通过 <>来定义要操作的引用数据类型

在使用java提供的对象时,什么时候写泛型呢?

通常在集合框架中很常见,只要见到<> 就要定义泛型

在类上面定义泛型:

package CollectionTest;

class Worker{
    
}
class Tool<String>{
    private Object obj;
    public void setObject(Object obj){
        this.obj=obj;
    }
    public Object getObject(){
        return obj;
    }
    
}

public class GenericDemo2 {
    
    public static void main(String[] args){
        Tool tool = new Tool();
        tool.setObject("abc");
        System.out.println(tool.getObject());
    }

}

在方法上面定义泛型:(一定是在返回类型的前面定义)

 泛型类定义的泛型,在整个类中有效,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了

public static <int> void showInt(T t){
        System.out.println(t);
    }
    

为了让不同方法可以操作不同的类型,而且类型还不确定。

那么可以将泛型定义在方法上

泛型的通配符:

1. 通配符使用的场景


 方法的形参!

2. 通配符的优点
  使方法更加通用!

3. 通配符分类
  无界通配:?
  子类限定:? extends Object
  父类限定:? super Integer

4. 通配符缺点
  使变量使用上不再方便
  无界:参数和返回值为泛型的方法,不能使用!
  子类:参数为泛型的方法不能使用
  父类:返回值为泛型的方法不能使用

简单通配符的使用例子:

package CollectionTest;

import java.util.ArrayList;
import java.util.Iterator;

public class GenericDemo3 {

    //通配符的使用
    public static void printColl(ArrayList<?> al){
        Iterator<?> it = al.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<String> al = new ArrayList<String>();
        al.add("abc1");
        al.add("add2");
        al.add("abc3");
        
        ArrayList<Integer> al2 = new ArrayList<Integer>();
        al2.add(123);
        al2.add(1234);
        al2.add(12345);
        
        printColl(al);
        printColl(al2);
    

    }

}

?通配符,也可以理解为占位符

泛型的限定:

? extends E:可以接受E类型或者E类型的子类型,上限

? super E:可以接受E类型或者是E类型的父类型,下限

复杂通配符的使用例子:

package CollectionTest;

import java.util.ArrayList;
import java.util.Iterator;

class Person1{
    private String name;
    private int age;
    Person1(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
class Student1 extends Person1{

    Student1(String name, int age) {
        super(name, age);
        // TODO Auto-generated constructor stub
    }
    
}

public class GenericDemo3 {

    //通配符的使用
    public static void printColl(ArrayList< ? extends Person1> al){
        Iterator<? extends Person1> it = al.iterator();
        while(it.hasNext()){
            Person1 p = it.next();
            System.out.println(p.getName()+".."+p.getAge());
        }
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<Person1> al = new ArrayList<Person1>();
        al.add(new Person1("lisi1",10));
        al.add(new Person1("lisi2",20));
        al.add(new Person1("lisi3",30));
        printColl(al);
        
        ArrayList<Student1> al1 = new ArrayList<Student1>();
        al1.add(new Student1("zhangsan1",10));
        al1.add(new Student1("zhangsan2",20));
        al1.add(new Student1("zhangsan3",30));
        printColl(al1);
        
    

    }

}
原文地址:https://www.cnblogs.com/sunxiaoyan/p/8676095.html