《Java架构筑基》从Java基础讲起——泛型的限制
2019-12-26 20:39
1436 查看
一. 模糊性错误
对泛型类 User< T, K > 而言,声明了两个泛型类参数:T 和 K。在类中试图根据类型参数的不同重载 set() 方法。这看起来没什么问题,可编译器会报错
public class User<T, K> { //重载错误 public void set(T t) { } //重载错误 public void set(K k) { } }
首先,当声明 User 对象时,T 和 K 实际上不需要一定是不同的类型,以下的两种写法都是正确的
public class GenericMain { public static void main(String[] args) { User<String, Integer> stringIntegerUser = new User<>(); User<String, String> stringStringUser = new User<>(); } }
对于第二种情况,T 和 K 都将被 String 替换,这使得 set() 方法的两个版本完全相同,所以会导致重载失败。
此外,对 set() 方法的类型擦除会使两个版本都变为如下形式:
一样会导致重载失败
public void set(Object o) { }
二. 不能实例化类型参数
不能创建类型参数的实例。因为编译器不知道创建哪种类型的对象,T 只是一个占位符
public class User<T> { private T t; public User() { //错误 t = new T(); } }
三.对静态成员的限制
静态成员不能使用在类中声明的类型参数,但是可以声明静态的泛型方法
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; } }
此外,不能创建特定类型的泛型引用数组,但使用通配符的话可以创建指向泛型类型的引用的数组
public class User<T> { private T[] values; public User(T[] values) { this.values = values; } } public class GenericMain { public static void main(String[] args) { //错误,不能创建特定类型的泛型引用数组 User<String>[] stringUsers = new User<>[10]; //正确,使用通配符的话,可以创建指向泛型类型的引用的数组 User<?>[] users = new User<?>[10]; } }
五. 对泛型异常的限制
泛型类不能扩展 Throwable,意味着不能创建泛型异常类
相关文章推荐
- javaweb-day22-1(基础加强 - 反射泛型、通配符、有限制的通配符)
- 《Java架构筑基》从Java基础讲起——泛型的使用
- 《Java架构筑基》从Java基础讲起——泛型基础
- 黑马程序员——java基础之泛型
- Java自学之路-Java基础教程-41:Java的强转类型和泛型机制Generic
- 黑马程序员----java基础泛型
- Java基础 泛型限定的应用
- 黑马程序员-java基础 泛型
- java基础-反射(2):泛型相关周边信息获取
- Java基础系列:(1)关于泛型的简单总结
- java基础入门-泛型(1)-为什么需要使用泛型?
- java基础---->泛型
- 黑马程序员—Java基础加强—(泛型)
- 黑马 程序员——Java基础---泛型
- Java基础15:treeset;排序方法-比较器;泛型;
- 黑马程序员--Java基础加强--04.代码简化 书写规律III_数组参数【重载】【数组】【可变参数数组】【泛型可变参数数组】【个人总结】
- 黑马程序员--Java基础加强--05.【泛型通配符】【个人总结】
- JAVA基础【5.4】《Java核心技术1》继承-泛型数组列表
- 黑马程序员————java基础--------JDK1.5新特性之泛型、自动拆装箱、增强for、静态导入、可变参数
- Java基础_泛型