java assubclass_类方法 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 Class extends U> asSubclass(Class clazz) {

if (clazz.isAssignableFrom(this))

return (Class extends U>) this;

else

throw new ClassCastException(this.toString());

}

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

List strList = new ArrayList();

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 类型的范围

参考:

java isAssignableFrom instanceof 小结 专题

一句话总结: isAssignableFrom()方法是从类继承的角度去判断,instanceof()方法是从实例继承的角度去判断. public native boolean isAssignabl ...

Java【第七篇】面向对象之类设计

Java类的继承 类继承语法规则 < 修饰符> class < 子类名称> [extends < 父类>] { }  类的继承 子 ...

Java推断类和实例的关系

通常我们使用instanceOf关键字来推断一个对象是否是类的实例,近期博主看到isInstance关键字,不解与instanceOf的差别,故度娘了一下,顺便涨了一下姿势.    Java中推 ...

instanceof,isinstance,isAssignableFrom,asSubclass的区别

1,isAssignableFrom():是字节码对象的方法 是用来判断一个类的字节码对象和另一个类的字节码对象是否相同或是子类或接口. assignable英 [ə,sainəbl]美 [ə,sai ...

instanceof&comma; isinstance&comma;isAssignableFrom的区别

instanceof运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化.如果被测对象是null值,则测试结果总是false. 形象地:自身实例或子类实例 instanc ...

instanceof 与isAssignableFrom

instanceof 针对实例 isAssignableFrom针对class对象 isAssignableFrom   是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的超类或 ...

instanceof、 isinstance 与 isAssignableFrom的区别

instanceof运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化.如果被测对象是null值,则测试结果总是false. 形象地:自身实例或子类实例 instanc ...

isAssignableFrom与instanceof的区别

1.isAssignableFrom针对的是class对象: 2.instanceof是实例. isAssignableFrom是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的 ...

随机推荐

iOS - Runloop个人总结

调用堆栈: 程序运行之前,自上而下启动 iOS端用的所用系统framework都是动态链接的. dyld:The dynamic link editor 动态链接器

Exists 比Contains 慢非常多。

void Main() { List s = new List(){}; for(int i=0;i<10000;i++) { s.Add ...

ListView滑动删除效果实现

通过继承ListView然后结合PopupWindow实现 首先是布局文件: delete_btn.xml:这里只需要一个Button <?xml version="1.0" ...

关于&OpenCurlyDoubleQuote;创业者与VC见面的10个不成文细节点”

著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Will Wang链接:http://www.zhihu.com/question/19641135/answer/50974 ...

orangepi one AP模式配置

前两天买了一块orangepi one开发板,目的是做个局域网共享目录,具体共享协议用samba:这块板子有两个网卡,一个有线一个无线:有线主要用来ssh登陆调试,修改配置. 首先下载armbian的 ...

BeautifulSoup中查找元素 select&lpar;&rpar; 和find&lpar;&rpar;区别

从html中查找元素,之前一般都用find(),查找符合条件的第一个,如下 f = open(file, 'r') # 读取文件内容content = f.read()soup= BeautifulS ...

android ActionBarImpl can only be used with a compatible window decor layout

在Activity中添加 requestWindowFeature(Window.FEATURE_ACTION_BAR); requestWindowFeature(Window.FEATURE_AC ...

&lbrack;转&rsqb; oracle 数据库 SQL plus 连接方法

http://hi.baidu.com/zzy382/item/a5b197f97a38e01ba7298832 之前电脑上安装了一个 Oracle  有一段时间没用,就把密码给忘了,按上面链接里的操 ...

跳表&lpar;skiplist&rpar;Python实现

# coding=utf-8 # 跳表的Python实现 import random # 最高层数设置为4 MAX_LEVEL = 4 def randomLevel(): ""& ...

sql先分组,再算百分比

--先分组,再算百分比 SELECT  a.CooperationIntention ,         a.OrganizationID ,         COUNT(*) 数量 , CONVER ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值