RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:8:30-17:00
你可能遇到了下面的问题
关闭右侧工具栏

新闻中心

这里有您想知道的互联网营销解决方案
泛型在Java中的应用-创新互联

简介

Java 泛型的参数只可以代表类,不能代表个别对象。由于 Java 泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型。Java 编译器在编译泛型时会自动加入类型转换的编码,故运行速度不会因为使用泛型而 加快。Java 允许对个别泛型的类型参数进行约束,包括以下两种形式(假设 T 是泛型的类型参数,C 是一般类、泛类,或是泛型的类型参数):T 实现接口 I 。T 是 C ,或继承自 C 。一个泛型类不能实现Throwable接口。

建网站原本是网站策划师、网络程序员、网页设计师等,应用各种网络程序开发技术和网页设计技术配合操作的协同工作。成都创新互联专业提供网站制作、成都网站制作,网页设计,网站制作(企业站、自适应网站建设、电商门户网站)等服务,从网站深度策划、搜索引擎友好度优化到用户体验的提升,我们力求做到极致!

一. 模糊性错误

对泛型类 User< T, K > 而言,声明了两个泛型类参数:T 和 K。在类中试图根据类型参数的不同重载 set() 方法。这看起来没什么问题,可编译器会报错

public class User {
   //重载错误
   public void set(T t) {
   }
   //重载错误
   public void set(K k) {
   }
}

首先,当声明 User 对象时,T 和 K 实际上不需要一定是不同的类型,以下的两种写法都是正确的

public class GenericMain {
   public static void main(String[] args) {
     User stringIntegerUser = new User<>();
     User stringStringUser = new User<>();
   }
}

对于第二种情况,T 和 K 都将被 String 替换,这使得 set() 方法的两个版本完全相同,所以会导致重载失败。

此外,对 set() 方法的类型擦除会使两个版本都变为如下形式:

一样会导致重载失败

public void set(Object o) {
}

二. 不能实例化类型参数

不能创建类型参数的实例。因为编译器不知道创建哪种类型的对象,T 只是一个占位符

public class User {
   private T t;
   public User() {
     //错误
     t = new T();
   }
}

三.对静态成员的限制

静态成员不能使用在类中声明的类型参数,但是可以声明静态的泛型方法

public class User {
   //错误
   private static T t;
   //错误
   public static T getT() {
     return t;
   }
   //正确
   public static  void test(K k) {
   }
}

四. 对泛型数组的限制

不能实例化元素类型为类型参数的数组,但是可以将数组指向类型兼容的数组的引用

public class User {
   private T[] values;
   public User(T[] values) {
     //错误,不能实例化元素类型为类型参数的数组
     this.values = new T[5];
     //正确,可以将values 指向类型兼容的数组的引用
     this.values = values;
   }
}

此外,不能创建特定类型的泛型引用数组,但使用通配符的话可以创建指向泛型类型的引用的数组

public class User {
   private T[] values;
   public User(T[] values) {
     this.values = values;
   }
}
public class GenericMain {
   public static void main(String[] args) {
     //错误,不能创建特定类型的泛型引用数组
     User[] stringUsers = new User<>[10];
     //正确,使用通配符的话,可以创建指向泛型类型的引用的数组
     User[] users = new User[10];
   }
}

五. 对泛型异常的限制

泛型类不能扩展 Throwable,意味着不能创建泛型异常类

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网页标题:泛型在Java中的应用-创新互联
网页路径:http://cqwzjz.cn/article/djigjg.html