《Java架构筑基》从Java基础讲起——泛型的限制
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了《Java架构筑基》从Java基础讲起——泛型的限制,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1596字,纯文字阅读大概需要3分钟。
内容图文
一. 模糊性错误对泛型类 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,意味着不能创建泛型异常类
原文:https://blog.51cto.com/14637764/2462215
内容总结
以上是互联网集市为您收集整理的《Java架构筑基》从Java基础讲起——泛型的限制全部内容,希望文章能够帮你解决《Java架构筑基》从Java基础讲起——泛型的限制所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。