13.2.2 定义泛型类
Object 类为最上层的父类,很多程序员为了使程序更为通用,程序设计时通常使传入的值与返回的值都以 Object 类型为主。当需要使用这些实例时,必须正确地将该实例转换为原来地类型,否则在运行时将会发生 ClassCastException 异常。
为了提前预防这种问题,java提供了泛型机制。其语法如下:
类名<T>
其中,T 是泛型的名称,代表某一种类型。
package 十三;
public class Book<T> {
private T BookInfo;
public Book(T bookInfo) {
this.BookInfo = bookInfo;
}
public T getBookInfo() {
return BookInfo;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Book<String> bookName = new Book<String>("java从入门到精通");
Book<String> bookAuthor = new Book<String>("明日科技");
Book<Double> bookPrice = new Book<Double>(69.8);
Book<Boolean> hasSource = new Book<Boolean>(true);
System.out.println("书名:" + bookName.getBookInfo());
System.out.println("作者:" + bookAuthor.getBookInfo());
System.out.println("价格:" + bookPrice.getBookInfo());
System.out.println("是否附赠源码?:" + hasSource.getBookInfo());
}
}
13.2.3 泛型的常规用法
1.定义泛型类时声明多个类型
class MyClass<T1,T2>{}
其中,T1和T2 为可能被定义的类型。
这样,在实例化指定类型的对象时就可以指定多个类型。例如:
MyClass<Boolean,Float> m = new MyClass <Boolean,Float>();
2.定义泛型类时声明数组类型
例题13.7 定义泛型数组
package 十三;
public class ArrayClass<T> {
private T[] array;
public T[] getArray() {
return array;
}
public void setArray(T[] array) {
this.array = array;
}
public static void main(String[] args) {
ArrayClass<String> demo = new ArrayClass<String>();
String value[] = {"成员1","成员2","成员3","成员4","成员5"};
demo.setArray(value);
String array[] = demo.getArray();
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
13.2.4 泛型的高级用法
1.限制泛型可用类型
默认可以使用任何类型来实例化一个泛型类对象,但 java 中也对泛型类实例化的类型作了限制。
class 类名称<T extends anyClass>
例题13.9
package 十三;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class LimitClass<T extends List> {
public static void main(String[] args) {
//可以实例化已经实现的接口的类
LimitClass<ArrayList> l1 = new LimitClass<ArrayList>();
LimitClass<LinkedList> l2 = new LimitClass<LinkedList>();
//这句是错误的,因为 HashMap 类没有实现接口 List()接口
LimitClass<HashMap> l3 = new LimitClass<HashMap>();
}
}
2.使用类型通配符
在泛型机制中,提供了类型通配符,其主要作用是在创建一个泛型类对象时限制这个泛型类的类型实现或继承某个接口或类的子类。
泛型类名称<? extends List> a=null;
其中,<? extends List> 表示类型未知,当需要使用该泛型对象时,可以单独实例化。例如:
A<? entends List> a=null;
a = new A<ArrayList>();
a = new A<LinkedList>();