泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。一些强类型程序语言支持泛型,其主要目的是加强类型安全及减少类转换的次数,但一些支持泛型的程序语言只能达到部分目的。尽管泛型为程序设计语言带来了更多的可能,但是泛型本身还是存在一定的限制的,下面我们就来简单聊聊泛型存在的一些限制。
对于泛型类User<K,V>而言,声明了两个泛型类参数。在类中根据不同的类型参数重载show方法。
public class User<K, V> {
public void show(K k) { // 报错信息:'show(K)' clashes with 'show(V)'; both methods have same erasure
}
public void show(V t) {
}
}
由于泛型擦除,二者本质上都是Obejct类型。方法是一样的,所以编译器会报错。
换一个方式:
public class User<K, V> {
public void show(String k) {
}
public void show(V t) {
}
}
使用结果:
可以正常的使用
编译器也不知道该创建那种类型的对象
public class User<K, V> {
private K key = new K(); // 报错:Type parameter 'K' cannot be instantiated directly
}
静态方法无法访问类上定义的泛型;如果静态方法操作的类型不确定,必须要将泛型定义在方法上。
如果静态方法要使用泛型的话,必须将静态方法定义成泛型方法。
public class User<T> {
//错误
private static T t;
//错误
public static T getT() {
return t;
}
//正确
public static <K> void test(K k) {
}
}
不能实例化元素类型为类型参数的数组,但是可以将数组指向类型兼容的数组的引用
public class User<T> {
private T[] values;
public User(T[] values) {
//错误,不能实例化元素类型为类型参数的数组
this.values = new T[5];
//正确,可以将values 指向类型兼容的数组的引用
this.values = values;
}
}
泛型类不能扩展 Throwable,意味着不能创建泛型异常类
当然,上述的5中泛型的限制并不包含全部的限制,只是总结出的常见的一部分,有一些限制需要我们在特定的环境中才会有所体会。动力节点在线的视频课程中就要对Java泛型的诸多讲解,对泛型存在的限制也有提及,我们可以去看看有什么不一样的地方,自己思考感悟一番。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54