`
在水伊方
  • 浏览: 107191 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

黑马程序员-java高新技术05

阅读更多

----------------------android培训java培训、java学习型技术博客、期待与您交流!----------------------

 

        泛型是jdk1.5的一个新特性,用于解决安全问题,是一个类型安全机制,泛型的好处在于可以将运行时出现的问题转移到了编译时期,让运行时期问题减少,而且避免了强制转换。

        下面的这段代码编译不会报错,但是第5行在运行时却会java.lang.ClassCastException的错误,是因为存进去的是一个字符串类型的,而取出的时候却把它当成了一个int类型。

		ArrayList<String> list = new ArrayList<String>(); 
		list.add("aaa"); 
		list.add("bbb"); 
		int i = list.get(0); //编译器会报错

 

 

       在集合上运用泛型之后就不会出现这样的运行时错误,泛型限定了往集合中添加元素时的类型,如下代码:  

		ArrayList<String> list = new ArrayList<String>(); 
		list.add("aaa"); 
		list.add("bbb"); 
		int i = list.get(0); //编译器会报错

  

       以上代码指定了只能往集合中添加String类型的元素,当然取出来时也只会是String类型的元素,如果试图把元素强制转换成其他类型(此处是int类型),编译器就会报错。 

 

       在泛型中,参数化类型不考虑类型参数的继承关系,如下: 

		ArrayList<String> list1 = new ArrayList<Object>(); //编译错误
		ArrayList<Object> list2 = new ArrayList<String>(); //编译错误

  

      自定义泛型方法: 

	class Demo {
		public <T> void show(T t) {
			System.out.println(t);
		}
	}

      调用以上方法时,传递给参数t的是什么类型,打印就是什么类型,避免了写多个重载方法以打印不同类型的值

 

      自定义泛型类:    

      当类中要操作的引用数据类型不确定的时候就可以使用泛型类

class Utils<T> {
	private T t;

	public T getT() {
		return t;
	}

	public void setT(T t) {
		this.t = t;
	}	
}

     当实例化一个Utils泛型类时,该类中的对象类型就已经确定了,不能加入其他的类型

 

 

     自定义泛型接口:

	interface Inter<T> {
		void show(T t);
	}

 

     泛型接口跟普通的接口定义很相似,在接口的名称后面加上一个<T>即可

     实现了泛型接口的泛型类

	class InterImpl<T> implements Inter<T> {
		@Override
		public void show(T t) {
			System.out.println(t);
		}
	}

 

     泛型类的类型必须与泛型接口类的类型一致

 

     泛型的高级应用:泛型限定

     有时候并不希望往集合加入任何类型的对象,这时可以使用泛型限定

    

     限定通配符的上边界(以下的代码说明只能往Vector集合中加入NumberNumber的子类)

     正确:Vector<? extends Number> x = new Vector<Integer>();

     错误:Vector<? extends Number> x = new Vector<String>();

 

     限定通配符的下边界(以下的代码说明只能往Vector集合中加入IntegerInteger的父类)

     正确:Vector<? super Integer> x = new Vector<Number>();

     错误:Vector<? super Integer> x = new Vector<Byte>();

 

     有时候我们需要得到参数列表的泛型类别,  

     有如下方法:

public static <T> void applyVector(Vector<Date> v) {}

  

     现在我们需要得到参数列表的Date类型,这时可以通过反射的技术来获得,代码如下:

		Method applyMethod = GenericTest.class.getMethod("applyVector",
				Vector.class);
		Type[] types = applyMethod.getGenericParameterTypes();
		ParameterizedType pType = (ParameterizedType) types[0];
		System.out.println(pType.getActualTypeArguments()[0]);

 

  

    关于泛型:

   1.只有引用类型才能作为泛型方法的实际参数

   2.普通方法、构造方法和静态方法中都可以使用泛型。

   3.也可以用类型变量表示异常,称为参数化的异常,可以用于方法的throws列表中,但是不能用于catch子句中。

   4.在泛型中可以同时有多个类型参数,在定义它们的尖括号中用逗号分,例如:

      public static <K,V> V getValue(K key) { return map.get(key);}

   5.当一个变量被声明为泛型时,只能被实例变量和方法调用(还有内嵌类型),而不能被静态变量和静态方法调用。因为

      静态成员是被所有参数化的类所共享的,所以静态成员不应该有类级别的类型参数。

  

 

 

 

----------------------android培训java培训、java学习型技术博客、期待与您交流!----------------------

 

 

详情请查看:http://edu.csdn.net/heima

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics