zoukankan      html  css  js  c++  java
  • 泛型(6)-泛型方法

      前面介绍了在定义类,接口时可以使用泛型形参,在该类的方法定义和成员变量定义,接口的方法定义中,这些泛型形参可以被当成普通类型来使用.在一些另外的情况下,定义类,接口时没有使用泛型形参,但定义

    方法时想自己定义泛型形参,这也是可以的,Java5还提供了对泛型方法的支持.

          定义泛型方法

      定义一个方法将一个Object数组的所有元素添加到一个Collection集合中,可以考虑采用如下的代码来实现

    package com.j1803.generic_method;
    import java.util.Collection;
    public class Demo1 {
    static void fromArrayToCollection(Object[]a, Collection<Object>c){
    for(Object obj:a){
    c.add(obj);
    }
    }
    }

    这个方法只能将Object[]数组的元素复制到元素为Object(Object的子类不行)的Collection集合中,如果将Object改为?,那也不可以,因为Java不允许把对象放进一个未知的集合中.
    Java5提供了解决这个问题的办法,提供了泛型方法(Generic Method).所谓泛型方法,就是在声明方法时定义一个或者多个泛型形参.泛型方法的语法格式如下.
    修饰符<T,S>返回值类型 方法名(形参列表){
    方法体...
    }
    相比普通方法,泛型方法的方法名签名与普通方法的方法签名多了泛型形参的声明,泛型形参的声明以尖括号括起来,多个泛型形参之间用','隔开,所有的泛型形参声明放在方法修饰符和方法返回值之间.
    将上面的改为如下形式:
    package com.j1803.generic_method;
    import java.util.Collection;
    public class Demo1 {
    static <T> void fromArrayToCollection(T[]a, Collection<T>c){
    for(T obj:a){
    c.add(obj);
    }
    }
    }
    完整代码如下:
    package com.j1803.generic_method;
    import java.util.ArrayList;
    import java.util.Collection;
    public class Demo1 {
    //声明一个泛型方法,该泛型方法中带一个T泛型形参
    static <T> void fromArrayToCollection(T[]a, Collection<T>c){
    for(T obj:a){
    c.add(obj);
    }
    }
    public static void main(String[] args) {
    //下面的代码T代表Object类型
    Object[]obj=new Object[100];
    Collection<Object> co=new ArrayList<>();
    fromArrayToCollection(obj,co);
    //下面的代码T代表String类型
    String[]arr=new String[100];
    Collection<String> str=new ArrayList<>();
    fromArrayToCollection(arr,str);
    //T代表Integer类型
    Integer[] ig=new Integer[100];
    //T代表Float类型
    Float[] fg=new Float[100];
    //T代表Double类型
    Double[] db=new Double[100];
    //T代表Number类型
    Number[] nb=new Double[100];
    Collection<Number> cn=new ArrayList<>();
    fromArrayToCollection(ig,cn);
    fromArrayToCollection(fg,cn);
    fromArrayToCollection(db,cn);
    fromArrayToCollection(nb,cn);
    //fromArrayToCollection(arr,cn);//arr为数组,编译错误
    }
    }

      上面定义的泛型方法,该泛型方法定义了一个T泛型方法,这个T泛型就可以在该方法内当成普通类型使用,与接口,类声明中定义的泛型不同的是,方法声明中定义的泛型只能在该方法里使用,而接口,类声明总定义的泛型则可以在
    整个接口,类中使用.
      与类,接口中使用泛型参数不同的是,方法中的泛型参数无须显示传入实际类型参数,如上中调用fromArrayToCollection()方法时,无须再调用该方法前传入String,Object类型,编译器根据实参推断出泛型所代表的类型
    package com.j1803.generic_method;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    public class ErrorTest {
    static <E> void copy(Collection<E>to,Collection<E>from){
    for (E s:from) {
    to.add(s);
    }
    }
    static <E> void copy2(Collection<? extends E>from2,Collection<E>to2){//?E有什么不同呢
    for (E s:from2) {
    to2.add(s);
    }
    }
    public static void main(String[] args) {
    List<Integer>ig=new ArrayList<>();
    List<String>ls1=new ArrayList<>();
    //copy(ig,ls1);//编译错误
    List<String>ls2=new ArrayList<>();
    copy(ls1,ls2);
    List<Number>ln=new ArrayList<>();
    copy2(ig,ln);
    //copy2(ln,ig);//编译错误
    }
    }
     




  • 相关阅读:
    初学网络编程
    Python模块(三)(正则,re,模块与包)
    Python模块(二)(序列化)
    idea2020.2安装与破解
    部署-jenkins发布项目到linux环境
    部署-jenkins发布项目到windows环境
    部署-jenkins与gitlab结合使用
    部署-docker推送镜像到远程仓库
    部署-gitlab克隆地址踩坑
    部署-docker安装jenkins
  • 原文地址:https://www.cnblogs.com/shadow-shine/p/9658269.html
Copyright © 2011-2022 走看看