zoukankan      html  css  js  c++  java
  • java 类字面常量,泛化的Class引用

    类名.class 就是字面常量,代表的就是该类的Class对象引用。常量需要赋值给变量

      1. 简单,安全。 编译期接受检查,不需要像forName一样置于try/catch块中。
      2. 加载后不会进行初始化,初始化被延迟到静态方法静态域首次使用时。
      3. 类字面常量可用于类 接口 数组 基本数据类型
      4. 基本数据类型也有类字面常量如int.class, 对应的包装器的 Integer.TYPE。
                System.out.println(int.class); //int 
                System.out.println(Integer.TYPE); //int
                System.out.println(Integer.class); //class java.lang.Integer
      5. Integer继承自Number 但 Integer Class 对象不是 Number Class对象的子对象,也就是说Class<Number> cn  = int.class; 是错误的。

    二.泛化的Class引用

    1.普通的类引用可以重新指向任何其它的Class对象,使用泛型类引用只能赋值为指向其声明的类型,除外使用通配符?

      Class intClass = int.class;
        Class<Integer> genericIntClass = int.class;
        Class<?> i = int.class;
        i = double.class;
        genericIntClass = Integer.class; // Same thing
        intClass = double.class; 

    2.Class<?> 优于Class 因为Class在编译期不会产生警告,而Class<?>当指向一个非具体的类引用时会产生警告

    3.a.newInstance()如果Class引用a不是泛型引用,在编译期就不知道它会返回什么类型那么只能返回Object。

            Class a = A.class;
            Object t = a.newInstance();
            //A t =  (A) a.newInstance();//无法确定类型需要强制转换
            System.out.println(t.getClass().getName());//thinking14class.A

    4.a.newInstance()  a 是泛型引用并且能确定类型则会返回确切的类型。

            Class <A> a= A.class; 
            Class <? extends C> c= C.class; //上界
            Class <? super A> d= A.class; 
            A ta =  a.newInstance(); // 可以确定
            A tc =  c.newInstance(); // 上界至少它是一个C可以确定

     5. a.newInstance()  a 是泛型引用但不能确定类型则只能返回Object。

    复制代码
            Class <A> a= A.class; 
            Class <? extends C> c= C.class; //上界
            Class <? super A> d= A.class; //下界
            //A ta =  a.newInstance(); // 通配符无法确定
            
            A tc =  c.newInstance(); // 上界至少它是一个C可以确定
            
            //A td =  d.newInstance();//  下界无法确定
    复制代码

    6. 利用Class类的cast()方法来转换类型

    class Building {}
    class House extends Building {}

    public class ClassCasts {
    public static void main(String[] args) {
    Building b = new House();
    Class<House> houseType = House.class;
    House h = houseType.cast(b);
    h = (House)b; // ... or just do this.
    }
    } ///:~

    fd

  • 相关阅读:
    input只允许输入正整数
    CSS如何作小于1PX的边
    时间戳的处理
    图片转base64上传,视频同理。
    APIcloud微信支付和支付宝支付(方案2,主要在后台进行)
    H5滑条(input type=range)
    checkbox/radio 样式修改
    APIcloud制作APP 微信支付与支付宝支付
    JS获取鼠标左(右)滑事件
    DOM(Document object madle) 文档对象模型: 元素节点 文本节点 属性节点
  • 原文地址:https://www.cnblogs.com/jiangfeilong/p/10353988.html
Copyright © 2011-2022 走看看