泛型方法
泛型方法的定义格式及范例如下。
定义格式:修饰符 <类型> 返回值类型 方法名(类型名 变量名){}。
范例:public <T> void show(T t){}。
package com.fzy.demo02;
//在不使用泛型的情况下,如果名字相同的方法想传递不同类型的参数,则使用方法重载的方式来实现
/*public class Generic {
public void show(String s) {
System.out.println(s);
}
public void show(Integer i) {
System.out.println(i);
}
public void show(Boolean b) {
System.out.println(b);
}
}*/
/*
public class Generic<T> {
public void show(T t) {
System.out.println(t);
}
}*/
//泛型方法。使用泛型方法时,可以省略多个方法的重载,而且在实例化对象的时候也不需要实例化多个对象
public class Generic {
public <T> void show(T t) {
System.out.println(t);
}
}
package com.fzy.demo02;
public class GenericTest2 {
/*public static void main(String[] args) {
//在实体类中使用方法重载的时候只需要实例化一个对象,但是需要重载多个成员方法
Generic g = new Generic();
g.show("String");
g.show(911);
g.show(true);
}*/
/*public static void main(String[] args) {
//使用泛型类时,实体类中需要一个方法,但在调用的时候需使用不同的泛型实例化多个对象
Generic<String> strG = new Generic<>();
strG.show("String");
Generic<Integer> intG = new Generic<>();
intG.show(911);
Generic<Boolean> bolG = new Generic<>();
bolG.show(true);
}*/
public static void main(String[] args) {
//使用泛型方法时,只需要实例化一个对象就可以传递不同的参数,实现类似重载成员方法的效果
Generic g = new Generic();
g.show("String");
g.show(911);
g.show(true);
}
}
泛型接口
泛型接口的定义格式及范例如下。
定义格式:修饰符 interface 接口名<类型>{}。
范例:public interface Generic<T>{}。
可变参数
可变参数又称为参数个数可变,当将其用作方法的参数时,方法参数的个数就是可变的。可变参数的定义格式及范例如下。
定义格式: 修饰符 返回值类型 方法名(数据类型...变量名)。
范例: public static int sum(int...a)。
package com.fzy.demo04;
/**
* @Description: TODO 可变长参数
*/
public class Demo02 {
public static void main(String[] args) {
System.out.println(mySum(1, 2));
System.out.println(mySum(1, 2, 3));
//System.out.println(mySum(mySum(1, 2), mySum(3, 4)));
System.out.println(mySum(1, 2, 3, 4));
System.out.println(mySum(1, 2, 3, 4, 5));
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println(mySum(6, arr));
}
// private static int mySum(int[] a){
// return 0;
// }//形参为数组的只能接收数组作为参数
/**
* 通过可变长参数求和
* @param a 数组 (可变长参数格式)
* @return 结果
* 可变长参数可以接收任意个数的同类型数据
* 也可以接收数据类型相应的数组
* 可变长参数和普通参数连用的时候,必须放在参数列表的最后
*/
private static int mySum(int x, int ... a) {
int sum = 0;
/*for (int i : a) {
sum += i;
}*/
for (int i = 0; i < a.length; i++) {
sum += a[i];
}
return sum;
}
}
可变参数作为形参既可以接收任意个数的同类型数据也可以接收数组,也就是说当你参数传递一个int[],两个函数都能匹配上,因此会提示你函数已经存在了。
所属类 | 方法名 | 说明 |
Arrays | public static <T> List<T> asList(T... a) | 返回由可变参数组成的固定长度的列表 |
List | public static <E> List<E> of(E... e) | 返回包含任意数量元素的不可变列表 |
Set | public static <E> Set<E> of(E... e) | 返回一个包含任意数量元素的不可变集合 |
package com.fzy.demo04;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
/**
* @Description: TODO API中使用可变长参数
*/
public class Demo03 {
public static void main(String[] args) {
List<String> list1 = Arrays.asList("Hello", "world", "Java", "MySQL");
//list1.add("JavaScript"); //UnsupportedOperationException
//list1.remove(1); //UnsupportedOperationException
list1.set(1,"Python");
System.out.println(list1);
//不允许添加和删除,可以修改,因为添加和删除会修改列表的长度
List<String> list2 = List.of("111", "222", "333");
//list2.add("JavaScript"); //UnsupportedOperationException
//list2.remove(1); //UnsupportedOperationException
//list2.set(1,"Python"); //UnsupportedOperationException
System.out.println(list2);
//增删改都不允许
Set<String> set = Set.of("111", "222", "333");
//set.add("JavaScript"); //UnsupportedOperationException
//set.remove("222"); //UnsupportedOperationException
System.out.println(set);
//不支持增删,没有索引所以不能修改
}
}