不知道大家对于java泛型是怎么理解的?
大家认为泛型到底有什么作用了?
泛型只能存放指定类型的数据,底层对此进行了处理,我们只能对存取指定类型的数据
很多人一定是这么理解的吧,但实际上并不是哦,泛型只是为了规范在编译的时候对泛型做了判断,为了方便我们存取,减少编程错误,其实底层编译成字节码的时候并没有任何泛型,和jdk1.5之前其实是没区别的,如果我们绕开编译,那完全可以存放其他类型的数据
如何绕开,我们可以利用反射,大家看看下面的代码
package a; import java.util.ArrayList; import java.util.List; public class A { public A(String s) { slist.add(s); } private List<String> slist = new ArrayList<>(); public List<String> getSlist() { return slist; } public void setSlist(List<String> slist) { this.slist = slist; } }
首先我们定义了这么一个类,里面有一个带着泛型的list
然后
package a; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.List; public class B { public static void main(String[] args) throws Exception { A a1 = new A("测试数据"); Class clazz =Class.forName("a.A"); Method m =clazz.getMethod("getSlist", null); List la = (List) m.invoke(a1, null); la.add(new ben()); List la1=(List) m.invoke(a1, null); System.out.println(la1); } } class ben{ int i=1; String s="4"; @Override public String toString() { return "ben [i=" + i + ", s=" + s + "]"; } }
大家觉得最后打印的结果是什么呢
[测试数据, ben [i=1, s=4]]
结果是这样的,你没看错,我在泛型为String的集合里面放了一个自定义的类,如果泛型的编译的时候真的做了处理,那么在la.add(new ben());这一句的时候应该抛出类型转换异常
怎么样,是不是大吃一惊,发现和自己知道的完全不一样?(大神请无视)
相关推荐
可以限定集合中的元素类型,保证集合中的元素是按照要求放入的。 可以增强多态(继承多个接口而无需写继承类)。 保证参数有效。 泛型的局限性: 不能实例化泛型 T t = new T(); //error ...
11.6.2 基于引用类型的泛型的实例化 337 11.7 小结 338 第12章 委托和Lambda表达式 339 12.1 委托概述 340 12.1.1 背景 340 12.1.2 委托数据类型 341 12.1.3 委托类型的声明 342 12.1.4...
嵌套类型 221 部分类别和方法 222 限制 224 匿名型别 227 在查询中传回项目属性的子集 229 界面 230 明确界面实作 232 明确实作接口成员 234 使用继承明确实作接口成员 236 索引器 239 使用索引器 240 界面中的索引...
java采购管理系统源码 逆转录器 内容 Retrotranslator 是使 Java 应用程序与 Java 1.4、Java 1.3 和其他环境兼容的工具。...编译您的类并将它们放入某个目录,例如myclasses 。 进入解压目录并执行: java -jar retrot
单字段升序: 利⽤ mapreduce ⾃⾝的排序机制,把需要排序的字段作为 key 即可 其它排序: ⾃定义排序规则 ⽅案⼀:⾃定义 key 1. ⾃定义类实现 WritableComparable 接⼝,设置泛型为⾃定义类 2. 声明需要排序的...
10.3带两个类型参数的泛型类308 10.4有界类型309 10.5通配符参数311 10.6泛型方法313 10.7泛型接口315 10.8泛型类的继承317 10.8.1以泛型类为父类317 10.8.2以非泛型类为父类319 10.8.3运行时类型识别320 ...
6.9.1 理解泛型函数 280 6.9.2 CLR版本的计算器程序 285 6.10 小结 290 6.11 练习 291 6.12 本章主要内容 292 第7章 自定义数据类型 293 7.1 C++中的结构 293 7.1.1 结构的概念 294 7.1.2 定义结构 294 ...
泛型:用法、类型参数、通配符等。 2. 集合与容器 集合容器类:队列、列表、栈、Map、Set 等结构,含 ArrayList、LinkedList、ArrayDeque、PriorityQueue、HashMap、LinkedHashMap、TreeMap 及并发容器类等。 3. ...
泛型技巧系列:如何提供类型参数之间的转换 C#2.0 - Object Pool 简单实现 Attributes in C# 手痒痒,也来个c# 2.0 object pool 泛型技巧系列:用泛型打造可复用的抽象工厂 体验.net2.0的优雅(四):Provider、策略...
11.6 泛型概述292 11.7 本章习题300 第12章 12.1 理解线程304 12.1.1 什么是多线程304 12.1.2 进程和线程的区别304 12.1.3 线程的创建和启动305 12.1.4 Thread类介绍308 12.1.5 为什么需要多线程309 12.1.6 线程分类...
1.1.12 is操作符——检查变量是否为指定的类型 14 1.1.13 lock关键字——锁定 15 1.1.14 namespace关键字——定义命名空间 15 1.1.15 new运算符——创建一个新的类型实例 16 1.1.16 Object类型——所有类型的基类 17...
10、解决项目中的问题,小编遇到的最多的问题是因为继承关系用到了泛型,所以在反编译的时候丢失了List或者set返回值类型,找到错误上面定义的地方,将对应的类型添加到上面就ok了! 11、appserver端代码搭建的...
像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...
15 applet java可以编写两类程序,applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java的特色在于它具有编制小应用程序的功能,applet可以在internet上传输并在兼容...
泛型 144 思考作业 145 上机作业 145 第八章 IO技术 146 为什么需要学习IO技术 146 基本概念 146 数据源 146 流的概念 146 第一个简单的IO流程序及深入(将文件中的数据读入) 146 Java中流的概念细分 148 Java中...