这一章节我们来讨论一下Class对象的泛化。
1.为什么需要泛化?
代码在编译时就可以进行类型检测,不需要等到运行时才检测类型。
2.例子
package com.ray.ch12;
public class Test {
public static void main(String[] args) {
try {
Class AClass1 = Class.forName("com.ray.ch12.A");
AClass1 = B.class;
Class<A> AClass2 = (Class<A>) Class.forName("com.ray.ch12.A");
// AClass2 = B.class;//error
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class A {
}
class B {
}
上面的例子我们看一下中间的代码,一开始没有使用泛化的时候,B.class可以赋值给AClass1,但是当我们给AClass2泛化的时候,B.class就不可以赋值给AClass2。
但是在运用Class.forName的很多时候我们都不知道类型的,因此都会使用通配符“?”。
3.通配符“?”
package com.ray.ch12;
public class Test {
public static void main(String[] args) {
try {
Class<?> AClass1 = Class.forName("com.ray.ch12.A");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class A {
}
使用通配符使得代码更加安全,不会出现警告信息。
而且通配符搭配extend,可以把类型的范围圈定在一个区间里面。
package com.ray.ch12;
public class Test {
public static void main(String[] args) {
try {
Class<? extends Father> AClass1 = (Class<? extends Father>) Class
.forName("com.ray.ch12.Sub");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class Father {
}
class Sub extends Father {
}
使用泛化主要是为了在编译时能够进行类型检测,不需要到运行时才知道有问题。
总结:这一章节主要介绍了泛化的原因、使用情况以及泛化的通配符。
这一章节就到这里,谢谢。
-----------------------------------