泛型
是一种编译时类型安全检测机制,允许在编译时检测非法的类型;
本质是参数化类型,也就是说所操作的数据类型被指定为一个参数;
泛型类的定义格式
修饰符 class 类名<类型>{ }
public class Generic{ }
T、E、K、V等型式的参数常用于表示泛型;
代码实例:
定义一个泛型:
public class shili<T> {
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
应用于类中:
public class fanxin {
public static void main(String[] args) {
shili<String> s1 = new shili<String>();
s1.setT("hahaa");
System.out.println(s1.getT());
shili<Integer> s2 =new shili<Integer>();
s2.setT(22);
System.out.println(s2.getT());
}
}
泛型方法
用泛型方法可以在调用方法时用更方便的方式定义相同的方法需要各种类型的输入内容的情况;
用一个方法就可以实现多个数据类型的方法
泛型方法实例代码:
public class Gen<T> {
public void show(T t){
System.out.println(t);
}
}
实现类代码:
Gen<String> g1 = new Gen<String>();
g1.show("hhh");
Gen<Integer> g2 = new Gen<Integer>();
g2.show(39);
Gen<Boolean> g3 = new Gen<Boolean>();
g3.show(true);
泛型接口
用泛型接口可以在调用接口时用更方便的方式定义相同的接口需要各种类型的输入内容的情况;
1、定义好接口修饰符interface接口名<类型>;例子: public interface Generic{}
2、定义接口的实现类,实现类的名称取名在接口名后加Impl,重写方法
public class GenericImpl implements Generic {}
3、在应用中用多态的方式调用
Generic<String> s = new GenericImpl<String>();
s.show("haha");
Generic<Integer> s1 = new GenericImpl<Integer>();
s1.show(22);
类型通配符<?>
<?>类型通配符它的元素可以匹配任何类型;
只是表示它是各种泛型的父类,并不能把元素添加到其中;
<?extends 类型> 类型通配符上限,上限是这种类型 <?super 类型> 类型通配符下限,下限是这种类型
List<?> list1 = new ArrayList();
可变参数
一个方法可以实现多个数据的求和
格式:修饰符 返回值类型 方法名(数据类型…变量名)
public static int sum(int... a){
int sum = 0;
for(int I : a){
sum +=i;
}
return sum;
}
注意:这里的变量其实是一个数组
如果一个变量中有多个参数,包含可变参数,可变参数要放在最后
List、Set、Arrays使用可变参数的静态方法中,返回的集合都不能做增删操作,即不能改变集合的长度;