泛型作用于编译阶段:

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

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


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. Angular 显示英雄列表

    在本页面,你将扩展<英雄指南>应用,让它显示一个英雄列表, 并允许用户选择一个英雄,查看该英雄的详细信息. 创建模拟(mock)英雄数据 你需要一些英雄数据以供显示. 最终,你会从远端的数 ...

  2. Cracking the Coding Interview 8.5

    Implement an algorithm to print all valid combinations of n-pairs of parentheses #include<stdio.h ...

  3. android 可拖动控件 ontouchevent

    首先附上文章的转载内容的链接: 学习android 可拖动事件首先需要对android的屏幕和touchevent参数建立一个详细的知识结构. 1.android坐标系统 一.首先明确一下 andro ...

  4. B - Chat room

    Problem description Vasya has recently learned to type and log on to the Internet. He immediately en ...

  5. 5.23@Comfiguration的解释

    @Configuration:代表这个类是一个配置类. @ComponentScan:用来扫描指定包下面的注解类. @Import:用来导入其他的@Configuration配置类. @ImportR ...

  6. Java实现九宫格

    import java.util.Scanner; public class Sudoku { public static void main(String[] args) { System.out. ...

  7. Django models 常用字段类型

    1.CharField字符串字段,存较短的字符串,长文本要用TextField.必须的参数:max_length 字符的最大长度2.TextField容量很大的文本字段.admin中用 <tex ...

  8. js视频学习笔记1

    1:数组赋值的个数长度定义无效,第4个存储的数还是能原封不动打印出来. js的数组是内部有一个变量名叫0,它的值是1,有一变量名叫1,它的值是2.是这样表示的 2:js是弱类型语言,没有var标识符, ...

  9. 关于Core里的 StartUp里的方法的理解。

    public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; ...

  10. dubbo之分组聚合

    按组合并返回结果 ,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项. 相关代码可以参考 dubbo 项目 ...