泛型--泛型通配符和泛型的上下限

泛型

泛型概述

  泛型:能够在类或者方法当中预支的使用未知的数据类型。java

备注:通常在建立对象的时候,将未知的数据类型肯定为具体的数据类型,当没有指定泛型时,默认类型为Object类型。框架

使用泛型的好处

  避免了类型转换的麻烦,存储的是什么样的数据类型,取出的就是什么样的数据类型ide

  把运行期异常(代码运行以后会抛出异常)提高到编译期阶段(写代码的时候就会报错。)测试

备注:泛型它其实也是数据类型的一部分,通常咱们将类名泛型合并一块儿看作数据类型。code

泛型的定义与使用

  泛型,用来灵活的将数据类型应用到不一样的类、方法、接口当中。将数据类型做为参数进行传递。对象

由于咱们的集合框架体系中,大量的使用了泛型继承

定义和使用含有泛型的类

定义格式:接口

修饰符 class 类名<表明泛型的变量>{
    
}

例如:ip

public class ArrayList<E>{
    public boolean add(E e){}
    public E get(int index){}
    //....
}

备注:定义的时候使用未知的泛型的变量,使用的时候(建立对象)肯定的泛型的具体类型。字符串

定义并使用含有泛型的方法

定义格式:

修饰符 <表明泛型的变量> 返回值类型 方法名(泛型参数){}

例如:

public class GenericMethod {
    // 定义带有泛型的方法
    public <VIP> void show (VIP vip) {
        System.out.println(vip);
    }
    // 定义一个含有泛型的返回值
    public <VIP> VIP show02(VIP vip) {
        //.....
        return vip;
    } 
}
// 定义测试类
public class TestGenericMethod {
    public static void main(String[] args){
        // 建立对象
        GenericMethod gm = new GenericMethod();
        // 调用带有泛型的方法
        gm.show("abc");// VIP vip 参数 ---》形参   String str  str="abc"
        gm.show(123);// VIP--->Integer  vip = 123
        gm.show2(3.14);// VIP --->Double vip=3.14
    }
}
定义并使用含有泛型的接口

定义格式:

修饰符  interface  接口名<表明泛型的变量> {}

例如:

public interface Collection<E> {
    public void add(E e);
    public Iterator<E> iterator();
}
// 自定义一个泛型的接口
public interface MyGenericInterface<T> {
    public abstract void add(E e);
    public abstract E get();
    //....
}

使用格式:

  1. 定义实现类时能够肯定泛型的类型

    public class MyInterfaceImpl implements MyGenericInterface<String> {
        @Override
        public void add(String e) {
            //....
        }
        @Override
        public String get(){
            // ....
        }
    }

    备注:此时泛型【T的值】就是String类型

  2. 始终不肯定泛型的类型,直到建立对象的时候,肯定泛型的类型

例如:

public class MyInterfaceImpl02<T> implements MyGenericInterface<T> {
    @Override
    public void add(T t) {
        //....
    }
    @Override
    public T get(){
        //......
    }
}

肯定泛型

/*
    使用泛型
 */
public class Demo04Generic {
    public static void main(String[] args) {
       MyInterface<String>  my =  new MyInterfaceImpl<String>();
        my.add("abc");
        
    } 
}

泛型通配符 (?)

  当使用泛型类或者泛型接口,传递的数据中,泛型的类型不肯定,能够经过通配符<?>表示。一旦程序当中使用泛型的通配符后,只能使用Object类中的共性的方法,集合中元素自身方法没法使用。

通配符的基本使用

​  泛型的通配符:不知道使用什么类型来接收的时候,此时可使用?,?表明未知的通配符。

  此时只能接收数据,不能往该集合当中存储数据。

代码示例:

public static void main(String[] args) {
    // 能够存储整数的集合
    Collection<Integer> list01 = new ArrayList<Integer>();
    // 此时list01能够存储整数的数据
    // 展现list01集合当中的数据
    getElement(list01);
    // 能够存储String字符串的集合
    Collection<String> list02 = new ArrayList<String>();
    // 此时list02能够存储字符串的数据
    getElement(list02)//   Collection<Object>  ×  不能够
    // 此时若是换成泛型通配符? 就能够接收
    getElement(list02);// 能够        
}
// 能够接收任意的数据类型
public static void getElement(Collection<?> coll){
    // 只能接收Integer类型的数据
    // 此时? 能够表明任意类型
}

备注:泛型不存在继承关系 Collection

相关文章
相关标签/搜索