1. 基本概念
1.1 泛型的基本概念
泛型是 Java SE 1.5 的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为 泛型类 、泛型接口、泛型方法。 Java 语言 引入泛型的好处是安全简单。在 Java SE 1.5 之前,没有泛型的 情况 的下,通过对类型 Object 的引用来实现参数的 “ 任意化 ” , “ 任意化 ” 带来的缺点是要做显式的 强制类型转换 ,而这种转换是要求开发者对 实际参数 类型可以预知的情况下进行的。对于强制类型转换错误的情况, 编译器 可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。泛型的好处是在编译的时候检查 类型安全 ,并且所有的 强制转换 都是自动和 隐式 的,以提高代码的重用率。
java 中泛型的引入主要是为了解决两个方面的问题:
- 1 集合类型元素在运行期出现类型装换异常,增加编译时类型的检查,向上转型:其核心目的在于参数的统一上,根本不需要强制类型转换。向下转型:是为了操作子类定义的特殊功能,需要强制类型转换,可是现在存在的问题是:向下转型其实是一种非常不安全的操作,以为编译的时候,程序不会报错,而在运行的时候会报错,这就是传说中的—迷之报错。
- 2 解决的时重复代码的编写,能够复用算法。下面通过例子来说明编译器的类型检查。
首先我们看一个没有使用泛型的例子:
ArrayList al = new ArrayList();al.add("abc");al.add("124");al.add("32L");
我们可以向 al 集合中添加任何类型的数据。当我们在取出数据的时候需要时候类型转换,如:
String s = (String)al.get(0);
String s1 = (String)al.get(1); // 在运行期,会报错,类型转换错误
Long l = (Long)al.get(2);
由此可以看到,没有泛型的时候,减少了编译时的类型检查,在取出元素时需要程序员对每个元素的类型都了解,否则很可能在运行时出现类型转换的异常。
那么下面我们通过泛型集合来看看他给我们带来的好处。
List<String> al1 = new ArrayList<>();
al1.add("abc");
al1.add(1); // 编译时报错
当我们用 String 参数类型实例化 al1 后,我们是不能添加 int 元素的,否则编译器会报错,通常在 IDE 编辑器,如 eclipse 中会有错误标识,与此同时,在取出元素也不需要类型转换。
String value = al1.get(0); // 不需要类型转换
这便是泛型所带来的好处。
那么算法的复用主要是体现在,方法的复用,如 ArrayList 的 Add 方法可以使用在任何类型上或限定的类型上。
泛型使用的基本例子
java 中的泛型主要使用在类,方法,与接口中。首先,我们来简单的看看在类上的使用:
添加测试方法:
class Factory{
Factory f = new Factory();
f.setValue("factory in use");
System.out.println(f.getValue());}
// 泛型接口的使用:interface MyInterface{void show(T t, U u);}
class ShowTest implements MyInterface{
@Overridepublic void show(String t, Integer u) {System.out.println(t);System.out.println(u);}
}
泛型类型参数作用于类上的时候主要是对多个字段及方法签名之间的类型约束。作用于方法的时候主要是对方法的的多个参数做相应的约束,在这里方法的泛型类型参数不再举例,下面我们主要介绍类型参数的约束。
《【知识点】Java泛型机制7连问》:https://zhuanlan.zhihu.com/p/385906824
《Java泛型深入理解》:https://blog.youkuaiyun.com/sunxianghuang/article/details/51982979
本文介绍了Java泛型的基本概念,探讨了泛型引入的原因及其带来的好处,包括增强编译时类型检查、减少运行时类型转换异常及提高代码复用率等。通过具体示例对比了使用泛型前后代码的区别。
1619

被折叠的 条评论
为什么被折叠?



