泛型

定义简单的泛型类 泛型方法

    /**
     * 1.定义一个泛型类
     *      在类名后添加类的泛型参数 <T>
     *      泛型类里面的所有T会根据创建泛型类时传入的参数确定类型
     * 2.定义泛型方法
     *      在方法名之前添加泛型参数 <U>
     *      U的类型会根据方法调用时传入的参数类型来确定
     */
    public class Box<T> {
        private T something;
        public T getSomething() {
            return something;
        }

        public <U> U getNewThing(U t){
            return t;
        }

        public void setSomething(T something) {
            this.something = something;
        }

        public static void main(String[] args) {
            Box<String> box1 = new Box<String>();
            box1.setSomething("圣杯");
            System.out.println(box1.getSomething());
            System.out.println(box1.getNewThing("先挣它的一个亿"));
        }
    }

泛型变量的限定

extends 后可接 接口 或 类 ,用 & 隔开多个限定类型(将接口放到最后,避免虚拟机进行转换操作)

    public <T extends People> T getPeople(T people){
            return people;
    }

通配符类型

    //通配符  匹配people的子类
    public String getSomething(Box<? extends People> b){
        return b.getSomething().getName();
    }

    //匹配 Hero的父类
    public String getSomething2(Box<? super Hero> b){
        return b.getSomething().toString();
    }

注意事项

不能使用基础类型初始化泛型参数(如int,只能用Integer)

不能实例化类型变量(如 new T())

静态属性,方法不能使用泛型参数

不能抛出,捕获泛型参数异常

反射

  • 运行中分析一个类
  • 运行中查看对象
  • 实现通用的操作
    /**
     * 解析类
     */
    String className = "knowledge.oop.Hero";
    Class<?> clazz = Class.forName(className);
    //解析类名
    Class<?> superClazz = clazz.getSuperclass();
    System.out.println("父类名: "+ superClazz.getName());

    //解析类修饰符
    String modifier = Modifier.toString(clazz.getModifiers());
    System.out.println("类修饰符: "+ modifier);

    //解析构造器
    Constructor[] constructors = clazz.getDeclaredConstructors();
    for(Constructor<?> c :constructors){
        System.out.println("构造器: " + c.getName());
        //解析构造器修饰符
        String mc = Modifier.toString(c.getModifiers());
        System.out.println("构造器修饰符: "+mc);
        //解析构造器 参数
        Class [] cp = c.getParameterTypes();
        for(int i =0;i< cp.length;i++){
            System.out.println("构造器参数: "+cp[i].getName());
        }
        System.out.println();System.out.println();
    }
    /**
     * 解析方法
     */
    Method [] methods = clazz.getMethods();
    for(Method m : methods){
        System.out.print("方法名: " + m.getName());
        String mc = Modifier.toString(m.getModifiers());
        System.out.print(" 方法修饰符: "+mc);
        Class returnType = m.getReturnType();
        System.out.print(" 方法返回类型: " + returnType.getName());
        //解析构造器 参数
        Class [] cp = m.getParameterTypes();
        if(cp.length > 0) System.out.println();
        for(int i =0;i< cp.length;i++){
            System.out.print("方法参数: "+cp[i].getName());
        }
        System.out.println();System.out.println();
    }

    /**
     * 解析属性
     */
    Field [] fields = clazz.getDeclaredFields();
    for(Field f : fields){
        System.out.println("属性名: " + f.getName());
        Class type = f.getType();
        System.out.println("属性类型: "+type.getName());
        String mc = Modifier.toString(f.getModifiers());
        System.out.print("属性修饰符: "+mc);
        System.out.println();System.out.println();
    }

    /**
     * 实例属性 操作
     */
    Field iFeild = clazz.getDeclaredField("skill");
    //这里不允许获取私有域的值 ,设置允许访问
    iFeild.setAccessible(true);
    System.out.println(iFeild.get(hero));
    //修改值
    iFeild.set(hero, "狂化");
    System.out.println(iFeild.get(hero));

    /**
     * 实例方法操作
     */
    Method iMethod = clazz.getMethod("getName");
    String s = (String) iMethod.invoke(hero);
    System.out.println(s);

java基础(9) - 泛型解析的更多相关文章

  1. 黑马程序员:Java基础总结----泛型(高级)

    黑马程序员:Java基础总结 泛型(高级)   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...

  2. 黑马程序员——JAVA基础之泛型和通配符

    ------- android培训.java培训.期待与您交流! ---------- 泛型:            JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...

  3. Java基础知识--泛型

    什么是泛型?为什么使用泛型? 泛型,就是参数化类型.提到参数,最熟悉的就是定义方法时候的形参,然后调用此方法时传递实参.顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也 ...

  4. Java基础:泛型

    Java的泛型是什么呢, 就是类型的參数化,这得类型包含方法參数和返回值.也就是原本该是确定类型的地方换成了变量,把类型的确定时间向后延迟了. 在之前,学过"重载"的概念,重载是什 ...

  5. 【Java基础】泛型

    Num1:请不要在新代码中使用原生类型 泛型类和接口统称为泛型.每种泛型定义一组参数化的类型,构成格式是:类或接口名称,接着用<>把对应于泛型形式类型的参数的实际参数列表括起来.比如:Li ...

  6. 黑马程序员——【Java基础】——泛型、Utilities工具类、其他对象API

    ---------- android培训.java培训.期待与您交流! ---------- 一.泛型 (一)泛型概述 1.泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制 ...

  7. Java基础之泛型——使用二叉树进行排序(TryBinaryTree)

    控制台程序. 1.实现针对容器类的基于集合的循环 为了让容器类类型的对象能够在基于集合的for循环中可用,类必须并且只需要满足一个要求——必须实现泛型接口java.lang.Iterable<& ...

  8. java基础之 泛型

    泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法 ...

  9. Java基础 Day14 泛型

    //为什么要使用泛型 //1.解决元素存储的安全性的问题 //2.解决获取元素时,须要类型转换的问题 //未使用泛型 package org.tizen.test; import java.util. ...

随机推荐

  1. C/s从文件(TXT)中读取数据插入数据库

    流程: 1.当按钮单击时,弹出OpenFileDialog 2.判断后缀名是否合法 3.导入数据库 按钮事件中的代码: 1.判断用户是否选中文件. 2.判断用户选择的文件是否为txt //第一步,当按 ...

  2. 【JAVAWEB学习笔记】02_HTML&CSS

    //--------------纯文本版------------------------------------------------- 今日新增单词(更多属性查看手册) form:表单 (要提交的 ...

  3. Word Ladder II 2015年6月4日

    Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ...

  4. Qt Opencv 在Linux下摄像头简单示例(转)

    下面写的文章也许网上也有类似的,但是大多数都没有给出思路及背景,让初学者每次都只能学到一点皮毛,不少知识需要大量搜索零碎地拼凑起来.题外话,虽然现在是碎片化信息时代,但正是这样信息整合能力也显得非常重 ...

  5. 011一对一 唯一外键关联映射_单向(one-to-one)

    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...

  6. JSONObject简介(2)

    JSONObject简介 本节摘要:之前对JSON做了一次简单的介 绍,并把JSON和XML做了一个简单的比较:那么,我就在想,如果是一个json格式的字符串传到后台,需要怎么对其处理?如果前台页面需 ...

  7. 每天一道Java题[10]

    题目 阐述创建线程最常用的两种方法及其对比. 解答 方法一:继承Thread类实现 步骤: 创建Thread类的子类,如MyThread. 重写Thread类的run()方法. 实例化MyThread ...

  8. [转]tomcat部署(1)

      阅读目录 1 目录结构 2 部署 3 发布 4 测试 本篇参考Tomcat官方文档:<First Webapp>翻译,并结合自己的开发经验介绍关于tomcat部署以及发布的相关内容. ...

  9. HTML面试题

    1.你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? 所谓的“浏览器内核”无非指的是一个浏览器最核心的部分-“Rendering Engine”,直译叫做“渲染引擎”,我们也常称为“排版引擎 ...

  10. struts2+hibernate+spring配置版框架搭建以及简单测试(方便脑补)

    为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->M ...