摘自:http://www.runoob.com/java/java-generics.html

JAVA泛型

  java泛型(generics)是JDK5中引入的新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

泛型的本质是参数化类型,也就是所操作的数据类型被指定为一个参数。

  假定我们有这样一个需求:写一个排序方法,能够对整型数组、字符串数组、甚至其他任何类型的数组进行排序,该如何实现?

  答案是可以使用java泛型。

   使用java泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序。

泛型方法

  你可以写一个泛型方法,该方法在调用时可以接受不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。

  下面是定义泛型方法的规则:

  • 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前。
  • 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
  • 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的点位符。
  • 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char等)。

实例

下面的例子演示了如何使用泛型方法打印不同字符串的元素:

public class GenericMethodTest{
//泛型方法,类型参数声明<E>在返回类型void之前
public static<E> void printArray(E[] inputArray){
for(E element:inputArray){
System.out.printf("%s ",element);
}
System.out.println();
} public static void main(String[] args){
//创建不同类型数组:Integer、Double、Character
Integer[] intArray = {1,2,3,4,5};
Double[] doubleArray = {1.1,2.2,3.3};
Character[] charArray = {'A','B','C'}; printArray(intArray);
printArray(doubleArray);
printArray(charArray);
}
}

编译以上代码,运行结果如下:

1 2 3 4 5
1.1 2.2 3.3
A B C

有界的类型参数:

可能有时候,你会想限制那些被允许传递到一个类型参数的类型种类范围。例如,一个操作数字的方法可能只希望接受Number或者Number子类的实例。这就是有界类型参数的目的。

要声明一个有界的类型参数,首先列出类型参数的名称,后跟extends关键字,最后紧跟它的上界。

实例

下面的例子演示了"extends"如何使用在一般意义上的意思"extends"(类)或者"implements"(接口).该例子中的泛型方法返回三个可比较对象的最大值。

public class MaximumTest{
//比较三个值并返回最大值
public static<T extends Comparable<T>> T maximum(T x,T y,T z){
T max = x; //假设x是初始最大值
if(y.compareTo(max)>0){
max = y;
}
if(z.compareTo(max)>0){
max = z;
}
return max;
} public static void main(String[] args){
//格式化字符串用printf
System.out.printf("%d、%d和%d中最大的数是:%d\n", 3,4,5,maximum(3,4,5));
//%.1f 保留小数点后1位
System.out.printf("%.1f、%.1f和%.1f中最大的数是:%.1f\n",6.6,8.8,7.7, maximum(6.6,8.8,7.7));
System.out.printf("%s、%s和%s中最大的数是:%s\n", "pear","apple","orange",
maximum("pear","apple","orange"));
}
}

编译代码,运行结果如下

3、4和5中最大的数是:5
6.6、8.8和7.7中最大的数是:8.8
pear、apple和orange中最大的数是:pear

泛型类

泛型类的声明 和非泛型类的声明类似,除了在类名后台添加了类型参数声明部分。

和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。

因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。

实例

如下实例演示了我们如何定义一个泛型类:

//泛型类:Box
public class Box<T>{
private T t; //成员变量t 的类型为T
public void add(T t){
this.t= t;
}
public T get(){ //方法返回类型为T
return t;
} public static void main(String[] args){
Box<Integer> integerBox = new Box<Integer>();
Box<String> stringBox = new Box<String>(); integerBox.add(new Integer(10));
stringBox.add(new String("hello world")); System.out.printf("整型值为:%d\n", integerBox.get());
System.out.printf("字符串为:%s\n", stringBox.get());
}
}

编译代码,运行结果:

整型值为:10
字符串为:hello world

 类型通配符

1.类型通配符一般是使用?代替具体的类型参数。例如List<?>

public class GenericTest{
public static void getData(List<?> data){
System.out.println("data:"+data.get(0));
} public static void main(String[] args){
List<String> name = new ArrayList<String>();
List<Integer> age = new ArrayList<Integer>();
List<Number> number = new ArrayList<Number>(); name.add("icon");
age.add(18);
number.add(314); //因为getData方法的参数是List类型的,所以name,age,number都可以作为这个方法的实参,这就是通配符的作用
getData(name);
getData(age);
getData(number);
}
}

2.类型通配符上限通过形如List来定义,如此定义就是通配符泛型值接受Number及其下层子类类型

public class GenericTest{
public static void getUperNumber(List<? extends Number> data){
System.out.println("data:"+data.get(0));
} public static void main(String[] args){
List<String> name = new ArrayList<String>();
List<Integer> age = new ArrayList<Integer>();
List<Number> number = new ArrayList<Number>(); name.add("icon");
age.add(18);
number.add(314); //getUperNumber()方法中的参数已经限定了参数泛型上限为Number,所以泛型String会报错
//getUperNumber(name);
getUperNumber(age);
getUperNumber(number);
}
}

3.类型通配符下限通过形如List<? super Number>来定义,表示类型只能接受Number及其三层父类类型,如Object类型的实例。

java之旅_高级教程_java泛型的更多相关文章

  1. Java之旅_高级教程_Java Mysql连接(1)

    工具:Eclipse .mysql5.7 MySQL连接驱动:mysql-connector-java-5.1.27.jar    获取地址:https://dev.mysql.com/downloa ...

  2. Java之旅_高级教程_网络编程

    摘自:http://www.runoob.com/java/java-networking.html JAVA网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. j ...

  3. Java之旅_高级教程_实例_文件操作

    1.文件写入 import java.io.*; public class MainClass{ public static void main(String[] args){ try{ Buffer ...

  4. Java之旅_高级教程_实例_数组

    摘自:http://www.runoob.com/java/java-examples.html 1.数组排序及元素查找 以下实例演示了如何使用sort()方法对Java数组进行排序,及如何使用 bi ...

  5. Java之旅_高级教程_序列化

    摘自 :http://www.runoob.com/java/java-serialization.html  Java序列化 Java提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字 ...

  6. Java之旅_高级教程_数据结构

    摘自:http://www.runoob.com/java/java-data-structures.html 了解即可 Java 数据结构 Java 工具包提供了强大的数据结构.在Java中的数据结 ...

  7. Java之旅_高级教程_多线程编程

    摘自:http://www.runoob.com/java/java-multithreading.html Java 多线程编程 Java 给多线程编程提供了内置的支持.一条线程指的是进程中的一条执 ...

  8. Java之旅_高级教程_URL处理

    摘自 :http://www.runoob.com/java/java-url-processing.html Java URL 处理 URL(Uniform Resource Locator)中文名 ...

  9. Java之旅_高级教程_实例_打印图形

    1.打印菱形 public class MainClass{ public static void main(String[] args){ printStar(10); } public stati ...

随机推荐

  1. Pitch detection algorithm(基音搜索算法)PDA相关链接

    第一:维基百科 http://en.wikipedia.org/wiki/Pitch_estimation 简要系统介绍了基音估计算法的分类和一些链接,论文 第二:http://ws2.bingham ...

  2. Java注解小记

    java注解是jdk1.5以后新出的特性,注解提升了Java语言的表达能力,有效地实现了应用功能和底层功能的分离,框架/库的程序员可以专注于底层实现. 1.Java内置注解 主要有三个: @Overr ...

  3. React Native 项目整合 CodePush 全然指南

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/y4x5M0nivSrJaY3X92c/article/details/81976844 作者 | 钱 ...

  4. Eclipse 中修改tomcat设置内存大小

    修改1: 在Eclipse中下面Servers双击Tomcat Server... 然后点击General InformAtion 下的Open launch configuration: 会弹出Ed ...

  5. vue返回上一页面如果没有上一页面返回首页

    methods: { back(){ if (window.history.length <= 1) { this.$router.push({path:'/'}) return false } ...

  6. [IR] Suffix Trees and Suffix Arrays

    前缀树 匹配前缀字符串是不言自明的道理. 1. 字符串的快速检索 2. 最长公共前缀(LCP) 等等 树的压缩 后缀树 Let s=abab, a suffix tree of s is a comp ...

  7. fiddler工作原理和代理设置

    1,什么是Fiddler Fiddler是一个http协议调试代理工具,它能够记录客户端和服务器之间的所有 HTTP请求,可以针对特定的HTTP请求,分析请求数据.设置断点.调试web应用.修改请求的 ...

  8. How to hard reset Visual Studio instance

    When developing extensions sometimes you just mess up, others someone else does. If you start gettin ...

  9. SQLAlchemy详细教程

    http://www.360doc.com/content/15/0914/16/360939_499094891.shtml

  10. Convert PLY to VTK Using PCL 1.6.0 or PCL 1.8.0 使用PCL库将PLY格式转为VTK格式

    PLY格式是比较流行的保存点云Point Cloud的格式,可以用MeshLab等软件打开,而VTK是医学图像处理中比较常用的格式,可以使用VTK库和ITK库进行更加复杂的运算处理.我们可以使用Par ...