关于Java泛型擦除的一点思考
泛型是JDK1.5后的一个特征,是一个参数类型的使用,能够将这个参数声明正在类、接口、方式中,就像我们方式中定义的局部变量一样;
说到泛型,就不得说起“擦除”这个概念,比拟于c#来说,java的泛型只存正在于法式的源码中,正在编译后的class文件中不存正在,这个过程就是--泛型擦除;
能够看到,正在编译后的class文件中,ArrayList所声明的泛型不存正在了;由此可知,若是想正在法式运转期间获取泛型,看似是一件不成能完成的工作!
曲到进修了jackson后,我发觉java泛型的“擦除”并不克不及一概而论;至多通过TypeReference接口,是能够获取到对象中的泛型;
一起头进修jackson,相关的api操做还不是很熟悉,json并没有转换成StudentEntity对象,而是变成了LinkedHashMap;研究后,发觉能够利用TypeReference对象,来实现参数化类型的json转换;
有些疑问?按照之前所说,因为泛型“擦除”的缘由,泛型正在编译后的class文件中就不存正在了,只会保留原始类型(Type中的概念),那么TypeReference又是若何实现,获取到了具体的泛型类型呢!
此时,对于泛型愈加迷惑了,感受心中有万万只草泥马正在飞跃!于是,又回过甚来看了下之前的代码 new TypeReferenceMapString,StudentEntity(){},发觉此段代码其实是一个匿名的内部类,而编译器正在编译的时候,会将此匿名内部类零丁生成一个class文件,定名法则如下:从类+$+(1,2,3….)
由此,对于java泛型的“擦除”并不克不及一概而论,正在运转期间,若是方式中呈现带泛型的匿名内部类,那么泛型照旧会被保留下来,我们能够通过对应的方式获取到现实的泛型类型!前往搜狐,查看更多


相关文章:
相关推荐:
网友评论:


