Listl1 = new ArrayList<>(); List l2 = new ArrayList<>(); System.out.println(l1.getClass() == l2.getClass());
这段代码的输出结果如下:
@Test public void anyTestHere() throws InterruptedException { Listls = new ArrayList<>(); ls.add("Hello Java"); List l = ls; List li = l; System.out.println(li.get(0)); }
这段代码的输出结果如下:
看了之后就不理解了,脑袋里冒出无数个why,对不对?下面来了解一下泛型的类型擦除。
泛型只是在程序的编译阶段起作用,运行时JVM并不会理会泛型,全部按Object进行处理。
写个代码简单看一下:
- 写一个泛型类:
class Generics{ private T field; public T getField() { return field; } public void setField(T field) { this.field = field; } }
- 获取类的类型和属性的类型:
@Test public void test() { Genericsgenerics = new Generics<>(); System.out.println(generics.getClass()); Field[] declaredFields = generics.getClass().getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println(declaredField.getType().getName()); } }
- 输出结果如下:
class com.test.test.service.Generics java.lang.Object
可以看到,类的类型并没有提现泛型相关的内容,属性的类型则是Object。
如何限制类型擦除那如果就想限制死类型怎么办?可以使用extends指定泛型上限:
class Generics{ private T field; public T getField() { return field; } public void setField(T field) { this.field = field; } }
限制了泛型的上限之后,再看一下泛型属性的类型,代码和输出结果如下:
可以看到,泛型类的属性的类型变成了String,这样就可以限制泛型的类型擦除了。
喜欢本文的朋友不要忘记点一个免费的赞哦,你的赞将是我最大的动力。
如果觉得有用,也可以扫码支持博主。感兴趣的朋友,可以在扫码的时候添加博主微信。
欢迎评论区留言讨论。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)