我们来看一段代码

public class Test3 {

    public static void main(String args[]) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
ArrayList<Integer> array=new ArrayList<Integer>();
array.add(1);//这样调用add方法只能存储整形,因为泛型类型的实例为Integer
array.getClass().getMethod("add", Object.class).invoke(array, "asd");
for (int i=0;i<array.size();i++) {
System.out.println(array.get(i));
}
} }

运行结果输出

1

asd

通过反射在运行期嗲噢哟红那个list的add方法,运行期已经擦除了类型参数信息,相当于运行期代码是

ArrayList array=new ArrayList();

array.add(1);array.getClass().getMethod("add", Object.class).invoke(array, "asd");

绕开了编译器类型参数安全检查,

但是为为什么array.get(I)的时候也能输出没有报错了

我们看一看字节码

get后去元素后直接输出

我们代码调整一下

public class Test3 {

    public static void main(String args[]) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
ArrayList<Integer> array=new ArrayList<Integer>();
array.add(1);//这样调用add方法只能存储整形,因为泛型类型的实例为Integer
array.getClass().getMethod("add", Object.class).invoke(array, "asd");
for (int i=0;i<array.size();i++) {
Integer a=array.get(i);
            System.out.println(a);
}
} } 直接抛出类型转换异常,为什么了?我们看看字节码

85:checkcast类型转换检查,由于asd是string,强制转integer报错


java 泛型 checkcast的更多相关文章

  1. Java泛型-内部原理: 类型擦除以及类型擦除带来的问题

    一:Java泛型的实现方法:类型擦除 大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除.Java的泛型基本上都是在编译 ...

  2. java泛型 8 泛型的内部原理:类型擦除以及类型擦除带来的问题

    参考:java核心技术 一.Java泛型的实现方法:类型擦除 前面已经说了,Java的泛型是伪泛型.为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉.正确理解泛型概念的首 ...

  3. java 泛型基础问题汇总

    泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引 ...

  4. java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  5. Java泛型之类型擦除

    类型擦除 学过C++模板的,在使用Java泛型的时候,会感觉到有点不疑问,例如:(1)无法定义一个泛型数组.无法调用泛型参数对象中对应的方法(当然,通过extends关键字是可以做到,只是比较麻烦): ...

  6. Java 泛型(Generics) 综述

    一. 引子 一般的类和方法.仅仅能使用详细类型:要么是基本类型.要么是自己定义类型.假设要编写能够应用于多种类型的代码,这样的刻板的限制对代码的束缚就会非常大. 多态算是一种泛化机制,但对代码的约束还 ...

  7. (转)java泛型

    转自:http://blog.csdn.net/lonelyroamer/article/details/7868820  java泛型(二).泛型的内部原理:类型擦除以及类型擦除带来的问题 参考:j ...

  8. java 泛型的内部原理:类型擦除以及类型擦除带来的问题

    一.Java泛型的实现方法:类型擦除前面已经说了,Java的泛型是伪泛型.为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉.正确理解泛型概念的首要前提是理解类型擦出(ty ...

  9. java泛型梳理

    java泛型梳理 概述 泛型,即参数化类型,是在JDK1.5之后才开始引入的. 所谓参数化类型是指所操作的数据类型在定义时被定义为一个参数,然后在使用时传入具体的类型. 这种参数类型可以用在类,接口, ...

随机推荐

  1. 《DSP using MATLAB》Problem 5.4

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  2. Mybaits代码生成使用

    https://jingyan.baidu.com/album/00a07f3869881082d028dc98.html PS:根据数据库中的表 生成代码

  3. 利用JavaScript jQuery实现图片无限循环轮播(不借助于轮播插件)-----转载

    前言 作为一个前端工程师,无论公司是什么行业,无论你做什么端,基本都会遇到一个避不开的动画效果:循环轮播.做轮播并不难,市场上的轮播插件有很多,其中比较著名的是swiper,使用也非常简单.但轮播插件 ...

  4. chrome自带调试工具介绍

    Chrome浏览器不仅可以调试页面.JS.请求.资源.cookie,还可以模拟手机进行调试等等,为开发者提供了很多方便,下面就介绍一下我常用到的调试技巧. 1.chrome浏览页面常用快捷键 Ctrl ...

  5. xmtech-3516默认环境变量

    xmtech # print bootcmd=setenv setargs setenv bootargs ${bootargs};run setargs;sf probe ;sf read ;squ ...

  6. day39 css

    一.css的引入方式 在HTML中引入css方式总共有三种: 行内样式 内接样式 外接样式 3.1 链接式 3.1 导入式 css介绍 现在的互联网前端分三层: HTML:超文本标记语言.从语义的角度 ...

  7. zookeeper 图形化的客户端工具:ZooInspector

    查看Zookeeper中的数据,我们可以通过ZkCli.sh命令客户端查看,但是不太直观,因为Zookeeper本身数据是以树型结构存储组织的, 今天推荐一个实用的界面操作工具ZooInspector ...

  8. Hive Shell 命令详解

    Hive服务介绍 Hive默认提供的cli(shell)服务,如果需要启动其他服务,那么需要service参数来启动其他服务,比如thrift服务.metastore服务等.可以通过命令hive -- ...

  9. Feign 自定义编码器、解码器和客户端

    Feign 的编码器.解码器和客户端都是支持自定义扩展,可以对请求以及结果和发起请求的过程进行自定义实现,Feign 默认支持 JSON 格式的编码器和解码器,如果希望支持其他的或者自定义格式就需要编 ...

  10. cpu怎么实现运算的

      这么好玩的问题,没人回答说不过去.不懂电子元件的码农我要强答一发了.太学术的我不会,你们也听不懂.所以臭不要脸非常不严谨地科普一记.说错不许打我.另外关于这个问题,推荐<编码 (豆瓣)> ...