这一章节我们来讨论一下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 { }
使用泛化主要是为了在编译时能够进行类型检测,不需要到运行时才知道有问题。
总结:这一章节主要介绍了泛化的原因、使用情况以及泛化的通配符。
这一章节就到这里,谢谢。
-----------------------------------
原文:http://blog.csdn.net/raylee2007/article/details/50180603