泛型作用于编译阶段:

泛型是作用于编译阶段,在编译阶段控制类型,以确保在编写代码的时候仅仅能传入指定类型数据到泛型集合对象中去。

怎样验证呢,贴代码例如以下:


package highBasic.generic;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList; public class StringAddToGenericInteger { public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
  ArrayList<String> collection =new ArrayList<String>();
  ArrayList<String> collection2 =new ArrayList<String>();
  ArrayList<Integer> collection3=new ArrayList<Integer>();
  //假设想等说明collection2和collection3指向的是同一份字节码。
  System.out.println(collection2.getClass()==collection3.getClass());
  //打印的结果是true
  //-------能否够透过编译器给collection3中加入String对象呢?
  //collection3.add("abc");------报错
  Method method=collection3.getClass().getMethod("add",Object.class );
  method.invoke(collection3, "abc");
  System.out.println("透过编译器,将String对象传到Integer类型的集合对象中。输出结果:"+collection3.get(0));
  //输出:“透过编译器。将String对象传到Integer类型的集合对象中,输出结果:abc”
  //说明以上做法实现了。
  //那么问题是这种做法有什么用途----------------------------?
 } }

上述code中的输出语句:

System.out.println(collection2.getClass()==collection3.getClass());

输出的结果是true,说明collection2和collection3指向的是同一份字节码,尽管在声明阶段指定的类型各自是String和Integer。

也就说明。java源程序编译成class文件以后,jvm执行程序阶段的时候,jvm根本不知道你限定的类型是什么。这也就更进一步的验证了前面所说的泛型的类型限定是作用于编译期间,在执行期间就不起作用了。

那么我们了解了这个,就能够设想怎样透过编译期,解决在类型限定情况下的非限定类型的值传入该集合对象,所以我们看以下这个面试题。解决的办法在上述代码中已经实现。

怎样将String对象传入Integer类型的泛型对象中?

Method method=collection3.getClass().getMethod("add",Object.class );

通过这句核心代码我们就得到的就是能够加入不论什么类型的数据到此集合对象中去。

为什么?

事实上非常easy,由于有类型限定的.java源文件编译成class以后。就已经没有了类型限定。能够理解为泛型的类型限定是作用在编译期间。一旦编译成功得到class文件以后,类型的限定就不复存在。

那么通过上述的反射方法。我们获取的正好是class文件信息,然后通过反射的getMethod()方法获取了泛型集合类型的add方法。通过这种方法相当于是透过了编译阶段将String对象传入到源程序中式Integer类型限定的泛型集合对象中。

java5核心基础之泛型(3)-泛型作用于编译阶段-怎样将String对象传入Integer类型的泛型对象中?的更多相关文章

  1. 泛型(二)封装工具类CommonUtils-把一个Map转换成指定类型的javabean对象

    1.commons-beanutils的使用 commons-beanutils-1.9.3.jar 依赖 commons-logging-1.2.jar 代码1: String className ...

  2. Java基础知识强化之集合框架笔记43:Set集合之TreeSet存储Integer类型的元素并遍历

    1. TreeSet类概述: • 能够对元素按照某种规则进行排序. • 或者根据创建set时提供的Comparator进行排序 • 具体取决于使用的构造方法 2. 代码示例: package cn.i ...

  3. Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    多态与接口重点摘要 接口特点: 接口用interface修饰 interface 接口名{} 类实现接口用implements表示 class 类名 implements接口名{} 接口不能实例化,可 ...

  4. 【java】泛型的作用是在编译阶段防止错误输入,绕过编译就绕过泛型,可用反射验证

    package com.tn.collect; import java.lang.reflect.Method; import java.util.ArrayList; public class Fa ...

  5. 【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  6. Java里泛型有什么作用

    1 泛型赋予了类型參数式多态的能力 2 泛型的第一个优点是编译时的严格类型检查,提高了程序的安全性和健壮性,这是集合框架最重要的特点. 3 泛型消除了绝大多数的类型转换.假设没有泛型,当你使用集合框架 ...

  7. C#复习笔记(2)--C#1所搭建的核心基础

    通过对C#1所搭建的核心基础的深入了解,可以知道之后的C#版本在C#1的基础上做了很多扩展,而这些扩展都是基于C#搭建的核心基础而来的. 委托 一.编写委托的过程 委托经常和C语言的“函数指针”挂钩. ...

  8. WCF 已知类型和泛型解析程序 KnownType

    数据协定继承 已知类型和泛型解析程序 Juval Lowy 下载代码示例 自首次发布以来,Windows Communication Foundation (WCF) 开发人员便必须处理数据协定继承方 ...

  9. (1) css的核心基础

     css的核心基础 1.css的基本语法在具体使用css之前,请各位兄弟姐妹先思考一个生活中的问题,一般情况下我们是如何描述一个人的呢? 小明{ 民族:汉族: 性格:温柔: 性别:男: 体重:68kg ...

随机推荐

  1. Android单选中listview中的一项

    public class LipsListAdapter extends BaseAdapter { private Context context; private List<Lips> ...

  2. Jmeter_Beanshell解析并提取json响应

    1:前置条件 将fastjson-1.2.49.jar包置于jmeter的lib目录下,并将该jar包添加到测试计划的Library中:否则会报:Typed variable declaration ...

  3. 微信图片不可显示java解决方法

    先看知乎:https://www.zhihu.com/question/35044484 场景: 微信上传了图片素材,返回了图片url,然后不能在img标签中正常显示. 原因是微信做了图片防盗连接. ...

  4. Spring boot (12) tomcat jdbc连接池

    默认连接池 tomcat jdbc是从tomcat7开始推出的一个连接池,相比老的dbcp连接池要优秀很多,spring boot将tomcat jdbc作为默认的连接池,只要在pom.xml中引入了 ...

  5. 网上干货 ElasticSearch详解与优化设计

    https://blog.csdn.net/joez/article/details/52171199?locationNum=3&fps=1 分析得很好,需要仔细阅读 问题遗留点: Fiel ...

  6. android 将手机号中间隐藏为星号(*)

    ){ StringBuilder sb =new StringBuilder(); ; i < pNumber.length(); i++) { char c = pNumber.charAt( ...

  7. Android第一次项目

    学习了一个月的Android,接触了人生中第一个安卓项目,对于一个小白来说,总结是很重要的学习方法,以下我把学到的东西总结以下: 1. 1>okhttp3用法解析(边贴代码边熟悉) public ...

  8. 连接Oracle数据库帮助类

    连接Oracle数据库帮助类,就是把连接Oracle数据库的方法封装起来,只需要在其它页面调用就可,不需要重复写. import java.sql.Connection; import java.sq ...

  9. springboot 的 @Async

    /** * Created by zhiqi.shao on 2018/4/3. */ @EnableAsync @Configuration public class TaskPoolConfig ...

  10. Memcached 之内存管理与删除机制

    一.内存的碎片化 如果用c语言直接 malloc,free 来向操作系统申请和释放内存时,在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用,这种空闲,但无法利用内存的现象称为内存的碎片化 ...