zoukankan      html  css  js  c++  java
  • 类方法 isAssignableFrom、instanceof 和 asSubclass

    类方法 isAssignableFrom、instanceof 和 asSubclass

    Spring 框架 CollectionFactory 的 asEnumType 方法使用 "类.asSubclass()",代码如下:

    private static Class<? extends Enum> asEnumType(Class<?> enumType) {
        Assert.notNull(enumType, "Enum type must not be null");
        if (!Enum.class.isAssignableFrom(enumType)) {
            throw new IllegalArgumentException("Supplied type is not an enum: " + enumType.getName());
        }
        return enumType.asSubclass(Enum.class);
    }
    

    1. class1.isAssignableFrom(class2)

    判断 class2 是不是 class1 的子类或者子接口

    List.class.isAssignableFrom(ArrayList.class)    // true            
    String.class.isAssignableFrom(ArrayList.class)  // false
    

    2. obj instanceof 类名

    "string" instanceof String  // true
    

    3. asSubclass

    public <U> Class<? extends U> asSubclass(Class<U> clazz) {
        if (clazz.isAssignableFrom(this))
            return (Class<? extends U>) this;
        else
            throw new ClassCastException(this.toString());
    }
    

    这是 java.lang.Class 中的一个方法,作用是将调用这个方法的 class 对象转换成由 clazz 参数所表示的 class 对象的某个子类。举例来说

    List<String> strList = new ArrayList<String>();  
    Class<? extends List> strList_cast = strList.getClass().asSubclass(List.class); 
    

    上面的代码将 strList.getClass() 获取的 class 对象转换成 Class<? extends List>,这么做似乎没有什么意义,因为我们很清楚 strList.getClass() 获取的class对象就是 ArrayList,它当然是 List.class 的一个子类;但有些情况下,我们并不能确知一个 class 对象的类型,典型的情况是 Class.forName() 获取的 class 对象:class.forName()的返回类型是 Class<>,但这显然太宽泛了,假设我们需要 List.class 类型的 class 对象,但我们传递给 Class.forName 的参数是未知的(可能是 "java.lang.String",也可能是 "java.util.ArrayList"),这时我们就可以用到 asSubclass() 这个方法了,如下:

    Class.forName("xxx.xxx.xxx").asSubclass(List.class).newInstance();
    

    当 xxx.xxx.xxx 是 List 的子类时,正常执行,当不是 List 的子类时,抛出 ClassCastException,这时我们可以做些别的处理;如果我们查看 Class.asSubclass() 在 JDK 中的中的引用的话,会发现这种用法有很多。asSubclass 用于窄化未知的 Class 类型的范围

    参考:

    http://blog.csdn.net/csywwx2008/article/details/17641405

  • 相关阅读:
    Linux-shell-算术运算{expr、bc、dc、(( ))和[ ]}
    [SHELL]:let 命令详解
    23-tcp协议——TIME_WAIT状态和FIN_WAIT2状态
    ethtool -p eth0 物理口一个灯在不停的闪烁
    PXE
    UID, EUID, SUID, FSUID
    echo $[1 + 2] shell中 $[] 在bash中同$(()),用于算术计算
    Cocos2d入门--3-- 向量的应用
    Cocos2d入门--2-- 三角函数的应用
    Cocos2d入门--1-- 初涉相关属性或代码
  • 原文地址:https://www.cnblogs.com/binarylei/p/8485599.html
Copyright © 2011-2022 走看看