Java为什么要在1.5之后增加泛型

  一个新技术的诞生,必定有其历史原因,通过究其历史,也能加深对技术的理解。

  Java1.5之后增加了泛型的使用,那么为什么要增加泛型呢?本文主要讲述这个问题。

  首先考虑一下如下的情况,

  

 1 package com.test.generic;
 2
 3 public class GenericTest {
 4     private Boolean f;
 5
 6     public Boolean getF() {
 7         return f;
 8     }
 9
10     public void setF(Boolean f) {
11         this.f = f;
12     }
13
14
15 }

 1 package com.test.generic;
 2
 3 public class GenericTest1 {
 4     private String s;
 5
 6     public String getS() {
 7         return s;
 8     }
 9
10     public void setS(String s) {
11         this.s = s;
12     }
13
14 }

  GenericTest和GenericTest1这两个类的实现的功能相同,只是方法的返回值和成员变量之间的差异,对于一些工具类来说,往往会对不同的数据类型进行处理,那么此时,就需要增加大量的对不同类型的数据处理的类,对于一个工程来说,这是可怕并且无意义的工作。在泛型之前,也有一个比较好的处理方式,如类GenericTest2,我们可以采用Object(接口或者父类)的类型,来实现对不同类型数据的处理。但这也不够完美,首先,每一次传进去的数据和取出来的数据必须一致,即使不一致,编译器也不会报错或者IDE也不会提醒问题;其次,假定传入的Object对象是String,但是我取值是强制转换成Integer,这在编译的时候也不会报错,运行时就会出现ClassCastException,这样问题就无法在编译时出现,对于程序来说,健壮性大大降低。所以,在Java1.5之后出现了泛型来解决这些问题。

 1 package com.testeneric;
 2
 3 public class GenericTest2 {
 4     private Object o;
 5
 6     public Object getO() {
 7         return o;
 8     }
 9
10     public void setO(Object o) {
11         this.o = o;
12     }
13
14 }

如类GenericTest3

 1 package com.test.generic;
 2
 3 public class GenericTest3<T> {
 4     private T o;
 5
 6     public T getO() {
 7         return o;
 8     }
 9
10     public void setO(T o) {
11         this.o = o;
12     }
13
14     public static void main(String[] args) {
15         GenericTest3<String> test1 = new GenericTest3<String>();
16
17         test1.setO("hello");
18         System.out.println(test1.getO());
19     }
20 }

这样类的参数类型是T,那么什么类型都可以传入到类中,实现了对不同类型的数据进行处理,并且在使用的时候,如果使用的是IDE,那么一旦确认下来T是什么类型,编译器就会提示该类型,只要编译的时候没有问题,那么运行时也不会出现问题。

时间: 2024-09-15 19:55:28

Java为什么要在1.5之后增加泛型的相关文章

java中利用反射机制绕开编译器对泛型的类型限制

首先看下面这个例子 public static void main(String[] args) { ArrayList<Integer> al1 = new ArrayList<Integer>(); al1.add(1); ArrayList<String> al2 = new ArrayList<String>(); al2.add("hello"); //int型链表和string型链表,结果为true System.out.pr

菜鸟学Java(二十二)——重新认识泛型

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引入泛型的好处是安全简单. 规则和限制 1.泛型的类型参数只能是类类型(包括自定义类),不能是简单类型.2.同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的.3.泛型的类型参数可以有多个.4.泛型的参数类型可以使用extends语句,例如<T extends sup

java JDK8 学习笔记——第18章 自定义泛型、枚举与注释

第十八章 自定义泛型.枚举与注释 18.1 自定义泛型 泛型定义: (1)仅定义在方法上的泛型语法 (2)用来限制泛型可用类型的extends与super关键字(3)?类型通配字符的使用 18.1.1 使用extends与? 1.若extends之后指定了类与接口,想再指定其他接口,可以使用&连接. 2.如果B是A的子类,而Node< B>可视为一种Node< A>,则称Node具有共变性或有弹性的.Java泛型不具有共变性,可以使用类型通配字符?与extends来声明变量

黑马程序员——java高新技术(新特性、反射、泛型)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- java高新技术 第一部分——JDK1.5新特性 1.增强for循环 格式: for(元素类型 变量名 : Collection集合 & 数组 ) { }//增强for循环括号里写两个参数,第一个是声明一个变量,第二个就是需要迭代的容器 高级for循环和传统for循环的区别: 高级for循环在使用时,必须要明确被遍历的目标.这个目标,可以是Collection集合或者数组,如果遍历Collec

java强化篇(四)---注解、泛型。类加载器.线程

Java的三个基本注解 @Deprecated :标记此程序元素已过时,通常是因为它很危险或存在更好的选择. @SuppressWarnings :取消显示指定的编译器警告. @Override :表示一个方法声明打算重写超类中的另一个方法声明.如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息. 元注解@Retention--定义注解类的存在区域,有三种取值:RetentionPolicy.SOURCE.RetentionPolicy.CLASS. Retention

Java基础系列:(1)关于泛型的简单总结

一 为什么要引入泛型这个概念? 这里我用一个实例来简单说明.比如说:我们要设计一个表示二维坐标的类,但是因为关于坐标的表示有多种形式,比如: (1)整数表示:x=10    y=20 (2)浮点型表示:x=10.5    y=20.8 (3)字符串表示:x=""东经 50度""    y="北纬 79度" 因此,在我们设计的类中就不能单一的设置成int,float或String,而想要使用一个类型来接收这三种不同的数据类型,就只能使用Object

[java基础] 遇到的一个关于返回值泛型的问题

在写代码的时候这样写: 1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class TestConversion { 5 public static void main(String[] args) 6 { 7 List<String> strList = getStringList(); 8 System.out.println(strList.contains("400036")); 9

Effective Java 第三版——32.合理地结合泛型和可变参数

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 32. 合理地结合泛型和可变参数 在Java 5中,可变参数方法(条目 53)和泛型都被添加到平台中,所以你可能希望它们能够正常交互; 可悲的是,他们并没有. 可变参数的目

JAVA集合框架之List和Set、泛型

一 List是有序可重复的集合 可以进行增删改查,直接看代码 1 package com.collection; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Iterator; 6 import java.util.List; 7 8 public class ListTest { 9 10 public List courseToList; 11 12 public ListTest