Java集合泛型之泛型方法

为了让方法可以操作不同类型的数据,而且类型不确定,可以将泛型定义在方法上。

1. 定义格式:

权限修饰符 <类型形参> 返回值类型 方法名(参数){...}

只有在修饰符和返回值类型之间用 <类型形参> 声明的方法才是泛型方法,使用泛型类或泛型接口的泛型的方法不一定是泛型方法。

在方法返回值类型前面声明的类型形参,只能在当前方法中使用,用于表示形参的类型、返回值类型或方法局部变量的类型,与泛型方法所属的类或接口无关,与其他方法无关,可以是静态的,也可以是非静态的。

泛型方法能独立于类而产生变化。

静态方法不能使用泛型类、泛型接口的泛型,所以,如果static修饰的方法要使用泛型能力,必须使其成为泛型方法。

2. 泛型方法使用

2.1 非静态泛型方法

public class MyGenericClass<T> {
    // 非泛型方法:此方法上的泛型T,使用的是类上定义的泛型,不是方法上自己定义的
    public void show(T t) {
        System.out.println(t);
    }

    //泛型方法: 方法上自己定义的泛型
    //数组转集合
    public <E> List<E> arrayToList(E[] array){
        ArrayList<E> list = new ArrayList<>();

        for(E e : array){
            list.add(e);
        }
        return list;
    }
}

调用方法时,确定泛型的类型

public class GenericMethodDemo {
    public static void main(String[] args) {
        // MyGenericClass类的泛型指定为String并创建对象
        MyGenericClass<String> gc = new MyGenericClass<>();
        gc.show("abc");
        //gc.show(200); //错误,show方法使用类上定义的泛型,已经指定为String,不能传递其它类型

        MyGenericClass<String> gc2 = new MyGenericClass<>();
        Integer[] nums = new Integer[]{25, 12, 36};
        List<Integer> intList = gc2.arrayToList(nums);
        System.out.println(intList);
        String[] strs = new String[]{"aaa", "bbb", "ccc"};
        List<String> strList = gc2.arrayToList(strs);
        System.out.println(strList);
    }
}

运行结果:

abc
[25, 12, 36]
[aaa, bbb, ccc]

2.2 静态泛型方法

public class MyGenericClass2 {
    // 泛型方法
    public static <T> T show(T t) {
        System.out.println("泛型方法执行了...");
        return t;
    }

    // 泛型方法,将数组中的元素添加到集合中
    public static <E> void addToList(E[] array, Collection<E> coll) {
        for (E e : array) {
            coll.add(e);
        }
    }
}

调用方法时,确定泛型的类型

public class GenericMethodDemo2 {
    public static void main(String[] args) {
        String str = MyGenericClass2.show("abc");//指定泛型类型为String
        System.out.println(str);
        Integer num = MyGenericClass2.show(150);//指定泛型类型为Integer
        System.out.println(num);

        Integer[] array = new Integer[]{25, 12, 36};
        Collection<Integer> coll = new ArrayList<>();
        MyGenericClass2.addToList(array, coll);
        System.out.println(coll);
    }
}

运行结果:

泛型方法执行了…
abc
泛型方法执行了…
150
[25, 12, 36]

2.3 泛型可变个数形参

例如:Collections工具类中向集合添加元素方法:

public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。

public static void main(String[] args) {
      ArrayList<Integer> list = new ArrayList<>();
      //原来写法
      //list.add(12);
      //list.add(14);
      //list.add(15);
      //list.add(1000);
      //采用工具类 完成 往集合中添加元素  
      Collections.addAll(list, 5, 222, 12);
      System.out.println(list);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值