zoukankan      html  css  js  c++  java
  • 集合框架(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);
            
        
    
        }
    
    }
  • 相关阅读:
    <frame>、<iframe>、<embed>、<object> 和 <applet>
    xss攻击
    回流 和 重绘
    defer 和 async 的区别
    从输入URL到浏览页面的过程
    webkit vs v8
    缓存
    LeetCode
    LeetCode
    LeetCode
  • 原文地址:https://www.cnblogs.com/sunxiaoyan/p/8676095.html
Copyright © 2011-2022 走看看