`
神绮_H_亚里亚
  • 浏览: 9676 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

泛型是否可以放其他类型

阅读更多

不知道大家对于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());这一句的时候应该抛出类型转换异常

怎么样,是不是大吃一惊,发现和自己知道的完全不一样?(大神请无视)

 

 

0
1
分享到:
评论

相关推荐

    \java超强笔记(超级经典)

    可以限定集合中的元素类型,保证集合中的元素是按照要求放入的。 可以增强多态(继承多个接口而无需写继承类)。 保证参数有效。 泛型的局限性: 不能实例化泛型 T t = new T(); //error ...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    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...

    C# 程序设计手册(WORD)

    嵌套类型 221 部分类别和方法 222 限制 224 匿名型别 227 在查询中传回项目属性的子集 229 界面 230 明确界面实作 232 明确实作接口成员 234 使用继承明确实作接口成员 236 索引器 239 使用索引器 240 界面中的索引...

    java采购管理系统源码-retrotranslator:Retrotranslator是使Java应用程序兼容Java1.4、Java1.3

    java采购管理系统源码 逆转录器 内容 Retrotranslator 是使 Java 应用程序与 Java 1.4、Java 1.3 和其他环境兼容的工具。...编译您的类并将它们放入某个目录,例如myclasses 。 进入解压目录并执行: java -jar retrot

    数据分析—排序.pdf

    单字段升序: 利⽤ mapreduce ⾃⾝的排序机制,把需要排序的字段作为 key 即可 其它排序: ⾃定义排序规则 ⽅案⼀:⾃定义 key 1. ⾃定义类实现 WritableComparable 接⼝,设置泛型为⾃定义类 2. 声明需要排序的...

    Java开发技术大全 电子版

    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 ...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    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 ...

    高级java笔试题-ShiftJava:学到头秃的Java的小笔记

    泛型:用法、类型参数、通配符等。 2. 集合与容器 集合容器类:队列、列表、栈、Map、Set 等结构,含 ArrayList、LinkedList、ArrayDeque、PriorityQueue、HashMap、LinkedHashMap、TreeMap 及并发容器类等。 3. ...

    asp.net知识库

    泛型技巧系列:如何提供类型参数之间的转换 C#2.0 - Object Pool 简单实现 Attributes in C# 手痒痒,也来个c# 2.0 object pool 泛型技巧系列:用泛型打造可复用的抽象工厂 体验.net2.0的优雅(四):Provider、策略...

    java基础案例与开发详解案例源码全

    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 线程分类...

    C#全能速查宝典

    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上百实例源码以及开源项目

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    java jdk实列宝典 光盘源代码

    15 applet java可以编写两类程序,applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java的特色在于它具有编制小应用程序的功能,applet可以在internet上传输并在兼容...

    JAVA基础课程讲义

     泛型 144 思考作业 145 上机作业 145 第八章 IO技术 146 为什么需要学习IO技术 146 基本概念 146 数据源 146 流的概念 146 第一个简单的IO流程序及深入(将文件中的数据读入) 146 Java中流的概念细分 148 Java中...

Global site tag (gtag.js) - Google Analytics