Java类型信息

1.泛化的Class引用:普通的类引用可以重新指向任何其它的Class对象,使用泛型类引用只能赋值为指向其声明的类型。为了使用泛化的Class引用时放松限制,使用通配符“?”,表示“任何食物”。Class<?> 优于Class 因为Class在编译期不会产生警告,而Class<?>当指向一个非具体的类引用时会产生警告。使用泛型的Class引用.newInstance(),返回的是确切类型的实例对象,而不是Object。

class Letter {
}

class A extends Letter {
}

public class Test7 {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        Class<? super A> a = Letter.class;
        Object obj = a.newInstance();
        Class<Letter> l = Letter.class;
        Letter l1 = l.newInstance();
    }
}

2.新的转型语法:cast()方法接受参数对象,并将其转型为Class引用的对象。Class.asSubclass():该方法允许将一个类对象转型为更加具体的类型。

class Letter1 {
}

class A1 extends Letter1 {
}

public class Test8 {
    public static void main(String[] args) {
        Letter1 l = new A1();
        Class<A1> a = A1.class;
        A1 a1 = a.cast(l);
        a1 = (A1) l;
    }
}

3.类型转换前先做检查:1.传统的类型转换由RTTI确保正确性。2.instanceof关键字,返回一个Boolean值,告诉我们对象是不是某个类或该类派生类的实例,他判断的是类型。3.instanceof不能比较Class对象,对于Class对象使用isAssignableFrom()判断。

interface InterfaceA {
}

class ClassA implements InterfaceA {
}

class ClassB implements InterfaceA {
}

class ClassC extends ClassA {
}

public class Test9 {
    public static void main(String[] args) {
        System.out.println(InterfaceA.class.isAssignableFrom(InterfaceA.class));//true
        System.out.println(InterfaceA.class.isAssignableFrom(ClassA.class));//true
        System.out.println(InterfaceA.class.isAssignableFrom(ClassB.class));//true
        System.out.println(ClassA.class.isAssignableFrom(ClassB.class));//false
        System.out.println(ClassA.class.isAssignableFrom(ClassC.class));//true
        System.out.println(InterfaceA.class.isAssignableFrom(ClassC.class));//true
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值