`
韩悠悠
  • 浏览: 839927 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

泛型讨论------危害

 
阅读更多

 

在泛型代码内部,无法获得任何有关泛型参数类型的信息。

 

例如:

 

public class TypeValue{
	
	public static void main(String[] args){

		Class c1 = new ArrayList<String>().getClass();
		Class c2 = new ArrayList<String>().getClass();

		System.out.println(c1==c2);
	}
}

 输出的结果是true

 

按照我们的意愿应该输出false,他们应该是不同的类型String和Integer,和输出的却是相同的类型,但是如果你吧

Integer放入ArrayList<Integer>中可以,放入ArrayList<String>却不可以,他们是相同的类型,却又不能放进Integer,很迷惑

 

下面的例子可解密

 

public class LostInformation{

	public static void main(Stirng[] args){

		List<Frob> list  = new ArrayList<Frob>();
		Map<Frob,Fnorkle> map = new HashMap<Frob,Fnorkle>();
		Quark<Fnorkle> quark  = new Quark<Fnorkle>();
		
		System.out.println(Arrays.toString(
			map.getClass().getTypeParameters());
		System.out.println(Arrays.toString(
			list.getClass().getTypeParameters());
		System.out.println(Arrays.toString(
			quark.getClass().getTypeParameters());
	}
}

 

输出:[E]

       [K,V]

        [Q]

 

说明:Class.getTypeParameters()将“返回一个TypeVariable对象数组,表示有泛型申明所申明的类型参数”

结果就是

        在泛型代码内部,无法获得任何有关泛型参数类型的信息

 

 

java的泛型是使用擦除来实现的,这意味当我们在使用泛型的时候,任何具体的类型信息都被擦除了,我们唯一知道的是我们在使用一个对象,因此List<String>和List<Integer>在运行时候的类型是相同的,这俩中类型都被查出了原始的类型即List.

 

 

边界<T extends HasF>申明T必须具备有类型HasF或者从HasF继承的类型,

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics