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
}
}

被折叠的 条评论
为什么被折叠?



