泛型作用于编译阶段:

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

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


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. Coursera Algorithms week3 归并排序 练习测验: Counting inversions

    题目原文: An inversion in an array a[] is a pair of entries a[i] and a[j] such that i<j but a[i]>a ...

  2. python实践

    https://www.cnblogs.com/smallSevens/p/10016045.html --二手房交易记录 https://www.cnblogs.com/xiangyuecn/p/1 ...

  3. Django html页面 'ascii' codec can't encode characters in position 8-10: ordinal not

    用Django开发的页面,之前用的是python3.X,后来又换成python2.X后各种报错,编码问题,于是在所有python文件开头加了编码:#coding=utf-8 但是后来发现,有些文件加了 ...

  4. CSS自定义消息提示

    1.效果 2.源码 <%@ page contentType="text/html;charset=UTF-8" language="java" %> ...

  5. vue.js $set的使用 数组

    [javascript] view plain copy <!DOCTYPE html> <html lang="en"> <head> < ...

  6. Android 存储路径选择

    Android能用来存储的地方有两个,一个是手机内置的存储空间,一个是外置的SD卡,内置的存储空间一般比较小,所以应用的缓存建议存储在外置的SD卡中. 在Android系统中如何获得存储的路径呢? p ...

  7. Oracle数据库的导入和导出

    Oracle数据库的导入和导出,是一项重要的的技术活,不但解决了数据库的导入导出,更方便快捷的获得数据. 使用imp和exp导入导出数据 使用exp导出数据 存放目录为\ORACLE_HOME\BIN ...

  8. 浅谈 Unserscore.js 中 _.throttle 和 _.debounce 的差异

    来源:http://blog.coding.net/blog/the-difference-between-throttle-and-debounce-in-underscorejs Unsersco ...

  9. layui 下拉框取值

    layui.use('form', function () { var form = layui.form; form.on('select(Status)', function (data) { c ...

  10. java 循环document 通用替换某个字符串或特殊字符

    document 生成xml时 报错 XML-20100: (Fatal Error) Expected ';'.  查了半天发现是 特殊字符 & 不能直接转出,需要进行转换,因为是通用方法很 ...