private static <T> T add(T x,T y){
return null;
}
调用
add(3,5);
Number x1 = add(3.5,3);
Object x2 = add(3,"abc");
上面类型是两个参数的公约数
数组
private static <T> void fillArray(T[] a,T obj){
for(int i=0;i<a.length;i++){
a[i] = obj;
}
}
private static <T> void swap(T[] a,int i,int j){
T tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
上面这个方法可以数值交换
swap(new String[]{"abc","xyz","itcast"},1,2);
//swap(new int[]{1,3,5,4,5},3,4);
上面这个不能自动拆箱装箱,因为自定义类型,他不知道你你要的是那个类型,说不定你就是需要这个类型,若他自动拆箱装箱的话,就违背了你原来想要的类型,所以不能用基本类型。
用于放置泛型的类型参数的尖括号应出现在方法的其他所有修饰符之后和在方法的返回类型之前,也就是紧邻
返回值之前。按照惯例,类型参数通常用单个大写字母表示。
只有引用类型才能作为泛型方法的实际参数,swap(new int [3],3.5),语句会报告编译错误。
除了在应用泛型时可以使用extends限定符,在定义泛型时也可以使用extends限定符,例如
Class.getAnnotation()方法的定义。并且可以用&来限定多个边界,如<V extends Serializable & Cloneable>
void method(){}
普通方法、构造方法和静态方法都可以使用泛型。编译器不允许创建类型变量的数组。
也可以用类型变量表示异常,称为参数化的导常,可以用于方法的throws列表中,但是不能用于catch子句中。
在泛型中可以同时有多个类型参数,在定义它们的尖括号中用逗号分,例如
public staic < k,v>V getValue(K key){ return map.get(key);}
<---------------------前面主要是方法自定义泛型,下面主要讲类自定义泛型-------------------------------->
public class GenericDao<E> {
public void add(E x){
}
public E findById(int id){
return null;
}
public void delete(E obj){
}
public void delete(int id){
}
public void update(E obj){
}
public static <E> void update2(E obj){
}
public E findByUserName(String name){
return null;
}
public Set<E> findByConditions(String where){
return null;
}
}
如果类的实例对象中的多处都要用到同一个泛型参数,即这些地方引用的泛型类型要保持同一个实际类型时,这时候 就要采用泛型类型的方式
进行定义,也就是类级别的泛型,语法格式如上。
GenericDao<ReflectPoint> dao = new GenericDao<ReflectPoint>();
dao.add(new ReflectPoint(3,3));
//String s = dao.findById(1);
类级别的泛型是根据引用该类名时指定的类型信息来参数化类型变量的。
注意:在对泛型类型进行参数化时,类型参数的实例必须是引用类型,不能是基本类型。
当一个变量被声明为泛型时,只能被实例变量和方法调用(还有内嵌类型),而不能被静态变量