isAssignableFrom() 证实了Java是非纯面向对象语言

本文解析了Java中Class类的方法isAssignableFrom的工作原理,通过示例代码展示了不同类型间的继承关系,并揭示了基本类型与Object及其包装类之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

人有见识就不轻易发怒;宽恕人的过失便是自己的荣耀


今天回顾了一下Glide源码,然后在ImageViewTargetFactory看到新鲜东西。

public class ImageViewTargetFactory {
  @NonNull
  @SuppressWarnings("unchecked")
  public <Z> ViewTarget<ImageView, Z> buildTarget(
      @NonNull ImageView view, @NonNull Class<Z> clazz) {
    if (Bitmap.class.equals(clazz)) {
      return (ViewTarget<ImageView, Z>) new BitmapImageViewTarget(view);
    } else if (Drawable.class.isAssignableFrom(clazz)) {
      return (ViewTarget<ImageView, Z>) new DrawableImageViewTarget(view);
    } else {
      throw new IllegalArgumentException(
          "Unhandled class: " + clazz + ", try .as*(Class).transcode(ResourceTranscoder)");
    }
  }
}

上述代码中的 isAssignableFrom() 显得格外引人注目。


 /** 
 	 * 区分调用者是否是参数cls的本身,或者是其父类or父接口。特别声明,如果是基本类型,则需精确匹配。
 	 * 
 	 * Determines if the class or interface represented by this
     * {@code Class} object is either the same as, or is a superclass or
     * superinterface of, the class or interface represented by the specified
     * {@code Class} parameter. It returns {@code true} if so;
     * otherwise it returns {@code false}. 
     * 
     * @exception NullPointerException if the specified Class parameter is
     *            null.(该方法会抛出 NPE(NullPointerException) )
     * @since JDK1.1
     */
    public boolean isAssignableFrom(Class<?> cls) {
        if (this == cls) {
            return true;  // Can always assign to things of the same type.
        } else if (this == Object.class) {
            return !cls.isPrimitive();  // Can assign any reference to java.lang.Object.
        } else if (isArray()) {
            return cls.isArray() && componentType.isAssignableFrom(cls.componentType);
        } else if (isInterface()) {
            // Search iftable which has a flattened and uniqued list of interfaces.
            Object[] iftable = cls.ifTable;
            if (iftable != null) {
                for (int i = 0; i < iftable.length; i += 2) {
                    if (iftable[i] == this) {
                        return true;
                    }
                }
            }
            return false;
        } else {
            if (!cls.isInterface()) {
                for (cls = cls.superClass; cls != null; cls = cls.superClass) {
                    if (cls == this) {
                        return true;
                    }
                }
            }
            return false;
        }
    }

我们通过测试,来验证一下该方法的功能,进而来探测一下基本类型和Object,以及其对应的包装类的关系:

 public static void main(String[] args) {
	 	System.out.println("Object 和 常用类的继承关系");
        System.out.println(Object.class.isAssignableFrom(Class.class)); // true
        System.out.println(Object.class.isAssignableFrom(String.class)); // true
        System.out.println(Object.class.isAssignableFrom(Runnable.class)); // true
        System.out.println(Object.class.isAssignableFrom(Integer.class)); // true
        System.out.println("Object 和 基本类型的继承关系");
        System.out.println(Object.class.isAssignableFrom(int.class)); // false
        System.out.println(Object.class.isAssignableFrom(double.class)); // false
        System.out.println(Object.class.isAssignableFrom(boolean.class)); // false
        System.out.println("基本类型和其对应的包装类的继承关系");
        System.out.println(Integer.class.isAssignableFrom(int.class)); // false
        System.out.println(Double.class.isAssignableFrom(double.class)); // false
        System.out.println(Boolean.class.isAssignableFrom(boolean.class)); // false
 }

总结

基本类型(boolean,int, double and so on…)和Object,以及其对应的包装类(Boolean, Integer, Double and so on…)在继承关系上没有什么关系。这也从侧面证明了Java不是纯面向对象语言

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值