泛型介绍 - 泛型类型和泛型方法(Java)

泛型介绍 - 泛型类型和泛型方法

泛型是Java5引进的新特征,是类和接口的一种扩展机制,主要实现参数化类型机制。在Java集合框架中大多数的类和接口都是泛型类型,使用泛型类型,程序员可以编写更安全的程序。

第一部分:泛型类型

泛型是带一个或多个参数类型的类或接口。首先我们创建一个Node类,下面一段代码定义一个泛型Node类表示节点,类型参数T表示节点中存放的数值。注:类型参数名使用单个大字母表示,常用的类型参数名有E(表示元素),K(表示键),T(表示类型),V(表示值)等等。

//泛型是带一个或多个类型参数的类或接口
//定义一个泛型Node<T>类表示节点,类型参数T表示节点中存放的值
public class Node <T>{
//定义一个data数据为T类型
private T data ;
//定义了一个不带参数的和一个带参数的构造方法
public Node() {}
public Node(T data) {
this.data = data ;
}
//一个访问数据和修改数据的方法
public T getData() {
return data ;
}
public void setData(T data) {
this.data = data ;
}
//数据data的Class类型的getName()方法,输出数据的类型名称
public void showType() {
System.out.println("T的类型是:" + data.getClass().getName()) ;
}
}

接下来,我们创建一个NodeDemo类,在该类中实例化对象,然后调用访问和修改方法。

//泛型类在编译阶段可以保证类型的安全
//用具体的类型去替换泛型类中的T
public class NodeDemo {
public static void main(String[] args) {
//在Node类中传递Integer参数,用具体的类型去替换Node类中的定义的T
Node<Integer> intNode = new Node<Integer>() ;
//修改数据为999,访问并输出数据
intNode.setData(new Integer(999));
System.out.println(intNode.getData());
//通过实例化对象intNode去调用showType方法
intNode.showType();
//创建两个泛型实例
Pair<Integer,String> p1 = new Pair<>(20,"twenty") ;
Pair<String,String> p2 = new Pair<>("China","Bejing") ;
//调用p1对象的两个方法
System.out.println(p1.getKey());
System.out.println(p1.getValue()) ;
}
}

然后,创建一个带两个参数的泛型接口,并定义两个抽象方法。

//定义一个带两个类型参数的泛型接口
public interface Entry<K,V>{
//定义两个抽象方法
public K getKey() ;
public V getValue();

}

最后,定义一个泛型类的Pair类和一个接口实现,都带K,V两个参数。定义了两个带参数的构造方法和和实现接口访问和修改的方法。

//定义一个泛型类的Pair类和一个接口实现
public class Pair<K,V> implements Entry<K,V>{
private K key ;
private V value ;
//定义两个带参数的构造方法
public Pair(K key, V value) {
this.key = key ;
this.value = value ;
}
//定义实现接口的访问和修改方法 
public void setKey(K key) {
this.key = key ;
}
public K getKey() {
	return key ;
}
public void setValue(V value) {
this.value = value ;
}
public V getValue() {
return value ;
}
}

总结:运行程序的结构如下图,输出了四个结果。
在这里插入图片描述
第二部分:泛型方法
泛型方法是带类型参数的方法。类的成员方法和构造方法都可以定义为泛型方法。下面我们来看具体的例子。

public class Util {
//泛型方法交换数组中的两个元素
public static <T> void swap(T [] array, int i, int j) {
T temp = array[i] ;
array[i] = array[j] ;
array[j] = temp ;
}
//compare方法带有两个Pair类的对象p1和p2,比较两个对象是否相等
public static <K,V> boolean compare (Pair<K,V> p1, Pair<K,V> p2) {
return p1.getKey().equals(p2.getKey()) && p1.getValue().equals(p2.getValue()) ;
}
public static void main(String[] arga) {
//声明一个数组numbers,并初始化
Integer [] numbers = {1,3,5,7} ;
//使用类型直接调用静态方法实现数组下标为0和3的元素的交换
Util.swap(numbers,0,3) ;
//使用增强for循环打印输出元素为7,3,5,1
for(Integer n : numbers) {
System.out.print(n + " ") ;
}
//声明两个Pair类型的p1和p2的对象,调用compare方法并打印是否相等结果
Pair<Integer,String> p1 = new Pair<>(1,"aaple") ;
Pair<Integer,String> p2 = new Pair<>(2,"orange") ;
boolean result = Util.compare(p1, p2) ;
System.out.println(result);
}
}

总结:运行结果如下图所示,两个泛型方法实现数组对应下标元素的交换以及比较对应元素是否相等。
在这里插入图片描述
通配符(?)的使用
泛型类型本身是一个Java类型,为泛型类型传递不同的类型参数会产生不同的类型。通配符表示任意数据类型。当所需数据类型不确定时候可以借助通配符。下面我们来看一个例子。

//使用List和ArrayList需要导入java的包如下
import java.util.*;
public class WildCardDemo {
//其中打印列表元素的的方法中的?就是通配符,可以为任意方法
public static void printList(List<?>list) {
//使用增强for循环打印list中的元素
for(Object element : list) {	
System.out.println(element);
}
}
public static void main(String[] args) {
//创建List泛型的两个实例化对象
List<String> mylist = new ArrayList<String>() ;
List<Integer> yourlist = new ArrayList<Integer>() ; 
//向列表中添如元素并调用方法打印输出
mylist.add("dog") ;
mylist.add("cat") ;
mylist.add("pig") ;
yourlist.add(1) ;
yourlist.add(2) ;
yourlist.add(3) ;
printList(mylist) ;
printList(yourlist) ;
}
}

运行结果如下:
在这里插入图片描述
有界类型的参数
有时候需要限制传递给泛型的参数的类型,例如,要求一个方法只接受元素是Number类或其子类的List实例,这就需要使用有界类型参数。
有界类型分为上界和下界,上界用extends指定,下界用super指定。下面我们来看一个例子。

import java.util.*;
public class BoundedTypeDemo {
//一个计算列表数据平均值的方法,采用有上界类型的参数
public static double getAverage (List<? extends Number> numberlist) {
double total = 0.0; 
//使用增强for循环求和,要将Number卡类型转换成double类型
for(Number number : numberlist) {
total += number.doubleValue() ;
}
//总和除以列表大小就是平均值
return total / numberlist.size();
}
public static void main(String[] args) {
//创建整形的实例对象,向列表中加如数据,调用函数求平均值
List<Integer> mylist = new ArrayList<>() ;
mylist.add(3) ;
mylist.add(4) ;
mylist.add(5) ;
System.out.println(getAverage(mylist));
//创建一个浮点型的实例对象,向列表中加如数据,调用函数求平均值
List<Double> yourlist =new ArrayList<>() ;
yourlist.add(6.0) ;
yourlist.add(5.0) ;
yourlist.add(4.0) ;
System.out.println(getAverage(yourlist)) ;
}
}

运行结果如下:
在这里插入图片描述
写了两个多小时才写完,如果对你有帮助,点个赞再走,谢谢您!

发布了41 篇原创文章 · 获赞 20 · 访问量 6683

猜你喜欢

转载自blog.csdn.net/nuist_NJUPT/article/details/104849389