首先告诉大家ArrayList就是泛型。
用法环境: 方法逻辑相同,只是数据类型不同,这个时候使用泛型方法 使用泛型方法,需要定义一个类型,使用大写字母 F,这个F表示任意的类型 写下返回值之前,void之前
public class FanxinDemo { public static void main(String[] args) {
Integer arr[] = new Integer[] { 1, 345, 30, 65, 260 }; System.out.println(Arrays.toString(arr)); swap(arr, 1, 3); System.out.println(Arrays.toString(arr)); String arr1[] = { "aa", "bb", "cc", "dd", "ff" }; System.out.println(Arrays.toString(arr1)); swap(arr1, 1, 2); System.out.println(Arrays.toString(arr1)); } private static <F> void swap(F[] arr, int i, int j) { F temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }输出结果为:
代码
class Point<T>{// 此处可以随便写标识符号 private T x ; private T y ; public void setX(T x){//作为参数 this.x = x ; } public void setY(T y){ this.y = y ; } public T getX(){//作为返回值 return this.x ; } public T getY(){ return this.y ; } }; //IntegerPoint使用 Point<Integer> p = new Point<Integer>() ; p.setX(new Integer(100)) ; System.out.println(p.getX()); //FloatPoint使用 Point<Float> p1 = new Point<Float>() ; p1.setX(new Float(100.12f)) ; System.out.println(p1.getX());输出结果为: (1)、定义泛型:Point 首先,大家可以看到Point,即在类名后面加一个尖括号,括号里是一个大写字母。这里写的是T,其实这个字母可以是任何大写字母,大家这里先记着,可以是任何大写字母,意义是相同的。
使用泛型的优势 (1)不用强制转换
//使用Object作为返回值,要强制转换成指定类型 Float floatX = (Float)floatPoint.getX(); //使用泛型时,不用强制转换,直接出来就是String System.out.println(p.getVar());
System.out.println(test(“aaaaa”)); //aaaaa 基本用法 System.out.println(test1(“aa”).get(0).equals(“aa”)); //true 用于内部包装 System.out.println(test2(new HashSet(), Collection.class).size()); //0 用于强制转换类型 System.out.println(test3(“bbbbb”)); //bbbbb 装神弄鬼 }
public static<T> T test(T obj){ return obj; } public static<T> List<T> test1(T obj){ List<T> list = new ArrayList(); list.add(obj); return list; } public static<T> T test2(Object str, Class<T> obj){ return (T)str; } public static<T, A, B, C, D> B test3(B obj){ return obj;静态方法泛型: 静态方法不可以访问类上定义的泛型 如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上
先定义一个泛型接口
interface Dao<T>{ public T text(); }通过类去实现这个泛型接口的时候指定泛型T的具体类型。 指定具体类型为Integer:
public class FanxinDemo implements Dao<Integer>{ int[] ages = {13,42,14}; @Override public Integer text() { Random ran = new Random(); return ages[ran.nextInt(3)]; } public static void main(String[] args) { FanxinDemo age = new FanxinDemo(); System.out.println(age.text()); } }指定具体类型为String:
public class FanxinDemo implements Dao<String>{ String [] names = {"xuyang","zhanhui","wangwang"}; @Override public String text() { Random ran = new Random(); return names[ran.nextInt(2)]; } public static void main(String[] args) { FanxinDemo age = new FanxinDemo(); System.out.println(age.text()); } }总结:泛型的使用使我们的代码更加具有通用性,不会导致定义了一种类型之后其他的类型都无法使用该代码。
通过泛型可以定义类型安全的数据结构(类型安全),而无须使用实际的数据类型(可扩展)。这能够显著提高性能并得到更高质量的代码(高性能),因为您可以重用数据处理算法,而无须复制类型特定的代码(可重用)。
想要了解更多的泛型知识: http://msdn.microsoft.com/zh-cn/library/sz6zd40f.aspx
