泛型
泛型是参数化类型,把数据类型变成了一个可以改变的参数。在不使用泛型的情况下,参数的数据类型都是不可改变的,使用泛型之后,可以根据程序的需要进行改变。
定义泛型的规则:
1.只能是类类型,不能是简单数据类型。
2.泛型参数可以有多个。
3.可以使用extends语句或者super语句,如<T extends superClass>
表示类型的上界,T 只能是 superClass 或其子类, <K super childClass>
表示类型的下界,K 只能是 childClass 或其父类。
/*
使用T代表类型,无论何时都没有比这更具体的类型来区分它。如果有多个类型参数,
我们可能使用字母表中T的临近的字母,比如S。
*/
class Test<T>{
private T ob;
/*
定义泛型成员变量,定义完类型参数后,可以在定义位置之后的方法的任意地方
使用类型参数,就像使用普通的类型一样。注意,父类定义的类型参数不能被子类继承。
*/
//构造函数
public Test(T ob){
this.ob = ob;
}
//getter 方法
public T getOb(){
return ob;
}
//setter 方法
public void setOb(T ob){
this.ob = ob;
}
public void showType(){
System.out.println("T的实际类型是: "+ob.getClass().getName());
}
}
public class TestDemo{
public static void main(String[] args){
// 定义泛型类 Test 的一个Integer版本
Test<Integer> intOb = new Test<Integer>(88);
intOb.showType();
int a = intOb.getOb();
System.out.println(a);
System.out.println("----------------------------------");
// 定义泛型类Test的一个String版本
Test<String> strOb = new Test<String>("Hello Gen!");
strOb.showType();
String s = strOb.getOb();
System.out.println(s);
}
}
编译运行:
$ javac TestDemo.java
$ java TestDemo
T的实际类型是: java.lang.Integer
value= 88
----------------------------------
T的实际类型是: java.lang.String
value= Hello Gen!
下面的例子中对类型参数赋予了具体的类型。
//Test.java
public class Test{
/*
注意:定义带类型参数的方法,其主要目的是为了表达多个参数以及返回值之间的关系。
例如本例子中T和S的继承关系, 返回值的类型和第一个类型参数的值相同。
*/
public<T,S extends T> T testDemo(T t,S s){
System.out.println("我是 T 类型,我的类型是" + t.getClass().getName());
System.out.println("我是 S 类型,我的类型是" + s.getClass().getName());
return t;
}
public static void main(String[] args){
Test test = new Test();
Dog d = new Dog();
Animal a0 = new Animal();
Animal a1 = test.testDemo(a0,d);//d(S类型)继承a0(T类型)
//Animal a1 = test.testDemo(d,a0);//d(T类型)继承a0(S类型)
//返回值的类型和第一个类型参数的值相同
System.out.println("我是整数 a,我的类型是" + a1.getClass().getName());
}
}
编译结果:
$ javac Test.java Dog.java Animal.java
$ java Test
我是动物
我是狗
我是动物
我是 T 类型,我的类型是Animal
我是 S 类型,我的类型是Dog
我是整数 a,我的类型是Animal
在无法确定类型参数的类型时,可以使用通配符。如果仅仅是想实现多态,优先使用通配符解决。
修改Test类:
//Test.java
import java.util.List;
import java.util.ArrayList;
public class Test{
public void testDemo(List<?> s){
for(Object obj:s){
System.out.println("我的类型是" + obj.getClass().getName());
}
}
public static void main(String[] args){
Test test = new Test();
Dog d = new Dog();
Animal a0 = new Animal();
List<Animal> a1 = new ArrayList<Animal>();
// List<Dog> a1 = new ArrayList<Dog>();
a1.add(d);
a1.add(a0);
test.testDemo(a1);
}
}
编译结果:
$ javac Test.java Dog.java Animal.java
$ java Test
我是动物
我是狗
我是动物
我的类型是Dog
我的类型是Animal