_045_泛型的使用

==========================

泛型的好处:
1 将运行时候的异常提前到了编译时(如果指定了String,而你加入了int,那么就会提示,如果没指定,那么是运行时才出错)
2 避免了无谓的强制类型转换

    (1) List<String> list1=new ArrayList<String>();
     (2)List<String> list1=new ArrayList(); 
     (3)List  list1=new ArrayList<String>(); 

 上面2种方法都可以用,(2)和(3)是为了兼容以前版本写的,了解即可,通常使用第一种

 自定义泛型:
 一个数据类型的占位符或者是一个数据类型的变量
 在泛型中不能使用基本数据类型,如果要使用,就需要使用对应的包装类
 byte--Byte
 int -- Integer
 short--Short
 long--Long
 double---Double
 flaot--Boolean
 char--Character

 方法上自定义泛型:
修饰符  <声明自定义泛型>返回值类型  函数名(使用自定义泛型){}
1 在方法上自定义泛型,这个自定义泛型的自定义数据类型是在调用该方法传入实参的时候确定的
2 我们一般用大写的字母来定义,只是一个习惯,不约束,一般是T 或者 E

在类上定义泛型:
1 类中的方法不用再定义泛型,这个数据类型是使用该类创建对象的时候确定的,意思就是说,如果这个类创建了Integer类型
那么就不能再接受String,如果还想再接受,那么就需要再创建一次对象,如果没有指定,那么就为object类型

接口上定义泛型:
1 接口上自定义的泛型的具体数据类型是再实现一个接口的时候指定的
2 再接口上自定义的泛型如果再实现接口的时候没有指定具体的数据类型,那么默认是Object
3 如果再实现的时候还不确定哪个数据类型,而是需要创建实现类的时候才指定,那么可以用下面的
class face_object<T> implements imp<T>{
  face_object<String>face=new face_object();

下面是在方法上定义泛型

class Test
{
	public static void main(String[] args)
	{
		// 泛型的使用
		 List<String> list1=new ArrayList<String>();
		 list1.add("abc");
		 list1.add("bvc");
		 list1.add("ashg");
		 // list1.add(123);指定了String,那么int就不能进来,当然还是可以用强制类型转换
		 
		 Iterator<String>iterator1=list1.iterator();
		 while(iterator1.hasNext()){
		 String string1=iterator1.next();
		 System.out.println(string1.toUpperCase());
		 }

		// 下面是自定义泛型测试
		String str = getData("abc");
		System.out.println(str);
		Integer integer1 = getData(123);
		System.out.println(integer1);
	}

	// 下面是自定义泛型书写
	public static <T> T getData(T ob)
	{
		// T就是一个占位符,就占个位置
		return ob;
	}
}

下面是接口和类下的泛型

//接口下的泛型
interface imp<T>{
	
	public void add(T t);
}

public class Test2<T> implements imp<T>
{
	public static void main(String[] xxx)
	{
		Ex<Integer> ex1 = new Ex<Integer>();
		Integer[] arr =
		{ 41, 68, 12, 11 };
		ex1.rev(arr);
	}

	public void add(T t){}// 实现接口的add方法
	

	// 可以接受任意类型的集合对象,要求接受的集合对象只能储存Interger或者是Integer的父类类型数据
	// 泛型中的通配符
	public static void print(Collection<? super Integer> c){}  // 指的是Integer上面的父类都可以接受
	

	public static void print2(Collection<? extends Integer> c){}// 指的是Integer下面的子类都可以接受
	
}


class Ex<T>
{
	//反转数组
	public void rev(T[] arr)
	{
		for (int i = 0, j = arr.length - 1; i < j; i++, j--)
		{// 这里必须除于2,不然就换回来了
			T temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
		}

		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < arr.length; i++)
		{
			sb.append(arr[i] + "  ");
		}
		System.out.println(sb.toString());
	}
}

猜你喜欢

转载自blog.csdn.net/yzj17025693/article/details/82762026