目录
引入:
Java 泛型泛型由来泛型应用
泛型类:
2、泛型方法
3、泛型接口
泛型高级(通配符)
引入:
看下面演示代码测试package cn.wen;import java.util.ArrayList;import java.util.Iterator;public class GenericDemo1 {public static void main(String[] args) {// 创建ArrayList array = new ArrayList();// 添加元素array.add("hello");array.add("world");array.add("java");//array.add(new Integer(100));array.add(10); // JDK5以后的自动装箱// 等价于:array.add(Integer.valueOf(10));// 遍历Iterator it = array.iterator();while (it.hasNext()) {// ClassCastException String s = (String) it.next();System.out.println(s);}}}
输出异常:
hello
world
java
Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
at cn.wen.GenericDemo1.main(GenericDemo1.java:49) ArrayList存储字符串并遍历
我们按照正常的写法来写这个程序, 结果确出错了。 为什么呢?因为我们开始存储的时候,存储了String和Integer两种类型的数据。 而在遍历的时候,我们把它们都当作String类型处理的,做了转换,所以就报错了。
但是,它在编译期间却没有告诉我们。所以,就觉得这个设计的不好。
回想一下,我们的数组
String[] strArray = new String[3];
strArray[0] = "hello";
strArray[1] = "world";
strArray[2] = 10;
集合也模仿着数组的这种做法,在创建对象的时候明确元素的数据类型(字符串)。这样就不会在有问题了。
而这种技术被称为:泛型。
泛型:是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。参数化类型,把类型当作参数一样的传递。
格式:
<数据类型>
此处的数据类型只能是引用类型。
好处:
A:把运行时期的问题提前到了编译期间
B:避免了强制类型转换
C:优化了程序设计,解决了黄色警告线
Java 泛型Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
假定我们有这样一个需求:写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,该如何实现?答案是可以使用Java 泛型。使用 Java 泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序。
修改上面代码:正常输出package cn.wen;
import java.util.ArrayList;import java.util.Iterator;
public class GenericDemo1 {public static void main(String[] args) {// 创建ArrayList
// 添加元素array.add("hello");array.add("world");array.add("java");//array.add(new Integer(100));//array.add(10); // JDK5以后的自动装箱// 等价于:array.add(Integer.valueOf(10));
// 遍历Iterator
看API,如果类,接口,抽象类后面跟的有
案例:
1)、用ArrayList存储字符串元素,并遍历。用泛型改进代码package cn.wen_02;
import java.util.ArrayList;import java.util.Iterator;
public class ArrayListDemo {public static void main(String[] args) {// 用ArrayList存储字符串元素,并遍历。用泛型改进代码ArrayList
array.add("hello");array.add("world");array.add("java");
Iterator
for (int x = 0; x < array.size(); x++) {String s = array.get(x);System.out.println(s);}}}2)、需求:存储自定义对象并遍历。
A:创建学生类
B:创建集合对象
C:创建元素对象
D:把元素添加到集合
E:遍历集合package cn.wen_02;import java.util.ArrayList;import java.util.Iterator;/** 需求:存储自定义对象并遍历。
** A:创建学生类* B:创建集合对象* C:创建元素对象* D:把元素添加到集合* E:遍历集合*/ public class ArrayListDemo2 {public static void main(String[] args) {// 创建集合对象// JDK7的新特性:泛型推断。
// ArrayList
ArrayList
学生类:
package cn.wen_02;public class Student {// 姓名private String name;// 年龄private int age;public Student() {super();}public Student(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}泛型由来为什么会有泛型呢 ?通过案例引入早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。
泛型应用泛型类把泛型定义在类上
格式 :public class 类名 < 泛型类型 1,…>
注意 : 泛型类型必须是引用类型泛 型方法把泛型定义在方法上
格式 :public < 泛型类型 > 返回类型 方法名 ( 泛型类型 .)泛 型接口• 把泛型定义在接口上
• 格式 :public interface 接口名 < 泛型类型 1…>泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。
和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。
泛型类:
package cn.wen_04;
/** 泛型类:把泛型定义在类上*/ public class ObjectTool
public T getObj() {return obj;}
public void setObj(T obj) {this.obj = obj;}}测试类package cn.wen_04;/** 泛型类的测试*/ public class ObjectToolDemo {public static void main(String[] args) {// ObjectTool ot = new ObjectTool();//// ot.setObj(new String("风清扬"));// String s = (String) ot.getObj();// System.out.println("姓名是:" + s);//// ot.setObj(new Integer(30));// Integer i = (Integer) ot.getObj();// System.out.println("年龄是:" + i);// ot.setObj(new String("林青霞"));// // ClassCastException// Integer ii = (Integer) ot.getObj();// System.out.println("姓名是:" + ii);System.out.println("-------------");ObjectTool实例如下实例演示了我们如何定义一个泛型类:public class Box
2、泛型方法
你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
下面是定义泛型方法的规则:
所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的
每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。
泛型方法类:
package cn.itcast_05;//未使用泛型之前//public class ObjectTool
测试泛型方法类:
package cn.wen_05;public class ObjectToolDemo {public static void main(String[] args) {// ObjectTool ot = new ObjectTool();// ot.show("hello");// ot.show(100);// ot.show(true);// ObjectTool实例下面的例子演示了"extends"如何使用在一般意义上的意思"extends"(类)或者"implements"(接口)。该例子中的泛型方法返回三个可比较对象的最大值。
public class MaximumTest{// 比较三个值并返回最大值public static 3, 4 和 5 中最大的数为 5 6.6, 8.8 和 7.7 中最大的数为 8.8 pear, apple 和 orange 中最大的数为 pear
3、泛型接口
接口类:
package cn.wen_06;/** 泛型接口:把泛型定义在接口上*/ public interface Inter
实现类:
package cn.wen_06;//实现类在实现接口的时候//第一种情况:已经知道该是什么类型的了//public class InterImpl implements Inter
测试类:
package cn.wen_06;public class InterDemo {public static void main(String[] args) {// 第一种情况的测试// Inter泛型高级(通配符)泛型通配符>任意类型,如果没有明确,那么就是 Object 以及任意的 Java 类了? extends E向下限定, E 及其子类? super E向上限定, E 及其父类package cn.wen;import java.util.ArrayList;import java.util.Collection;/** 泛型高级(通配符)* ?:任意类型,如果没有明确,那么就是Object以及任意的Java类了* ? extends E:向下限定,E及其子类* ? super E:向上限定,E极其父类*/ public class GenericDemo {public static void main(String[] args) {// 泛型如果明确的写的时候,前后必须一致Collection到此这篇关于Java 泛型(Generic)概述及使用的文章就介绍到这了,更多相关Java 泛型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:Java 泛型 Generic机制实例详解深入理解java泛型Generic Java泛型的用法及T.class的获取过程解析Java中方法名称和泛型相同的用法示例Java泛型定义与用法入门示例Java泛型和Class类用法示例
