浅谈泛型程序设计
Posted 个渣渣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈泛型程序设计相关的知识,希望对你有一定的参考价值。
一、为什么要使用泛型程序设计
1、泛型程序设计:以为这编写代码可以被很多不同类型的对象所重用。例如:我们不必为了聚集String和File而别设计不同的类;
2、使代码具有更好的可读性:ArrayList<String> str = new ArrayList<>(); 人们一看就知道是包含了String对象的数组列表;
二、定义简单的泛型类
泛型类:就是具有一个或多个类型变量的类。
声明语法:public class ClassName<T> {...}
例:
public class Pair<T> { private T first; private T second; public Pair(){ first = null; second = null; } public Pair(T frist,T second){ this.first = first; this.second = second; } public T getFirst(){ return first; } public T getSecond(){ return second; } public void setFirst(T first){ this.first = first; } public void setSecond(T second){ this.second = second; } }
Pair 类引入了一个类型变量 T ,用 (<>)括起来,并放在类名后边。泛型变量也可以有多个类型变量。例如:public class Pair<T,U>{.....}
注意:建议类型变量使用大写字母,而且要比较短。泛型类要写在一个单独的文件中。
用具体的类型替换类型变量就可以实例化泛型类型:Pair<String> pair = new Pair(); 或 Pair pair = new Pair(String,String);
三、泛型方法:
例如:
class ArrayAlg{ public static <T> T getA (T a){ //方法体;
return a; } }
注意:泛型方法既可以在泛型类中定也可以在普通类中定义。类型变量放在修饰符的后边,返回类型的前面。
方法的调用:String a = ArrayAlg.<String>gerA("hello world");在这种情况下(也是在大多数情况下)编译器有足够的信息能够判断所调用方法的类型,所以方法调用中可以省略<String>类型参数。
四、变量类型的限定
有时候我们要对类型变量加以约束,看下面的例子:
public class ArrayAlg { public static <T> T min(T[] a){ if(a == null || a.length == 0){ return null; } T smallest = a[0]; for(int i = 1;i < a.length;i++){ if(smallest.compareTo(a[i]) > 0) //error The method compareTo(T) is undefined for the type T return smallest = a[i]; } return smallest; } }
代码中变量smallest 类型为T ,这意味着它可以是任意一个类的对象。那么问题来了,我们怎么才能确信T所属的类有compareTo方法呢??解决这个问题的方法就是将T限制为实现了Comparable接口的类。可以通过对类型变量T设置限定实现这一点:
public static <T extends Comparable> T min(T[] a){........}
现在,泛型方法min只能被实现了Comparable接口的类(如String,LocalDate 等)的数组调用。
又一个问题出现了,众所周知Comparable是一个接口那么为什么要用关键字extends 而不是 implements呢?
记法:<T extends BoundingType > 表示T应该是绑定类型的子类型,T和绑定类型都可以是类,也可以是接口。选择关键字extends的原因是更接近于子类的概念。而且java设计者也不打算在语言中再添加一个新关键字了。
一个类型变量可以有多个限定,限定类型用“&” 分割,而逗号用来分割类型变量。例如:<T extends Comparable & Serializable,U extends String>
注意:可以根据需求有多个接口作为限定类,但是限定中至多有一个类。
以上是关于浅谈泛型程序设计的主要内容,如果未能解决你的问题,请参考以下文章