最近在忙着参加学校里面的计算机设计大赛,没有时间写博客,今天终于把我们团队的作品提交到学校里了,后天开始答辩,预祝我们团队有个好成绩!这篇博客接着说Java中的泛型,泛型的实质就是将数据的类型参数化。泛型有三种方式实现,分别是泛型类,泛型方法,泛型接口。
泛型类
定义方法:【修饰符】 class 类名 <T>
实例:
package demo_practice; public class Fanxing <T>{ private T age;//定义泛型类的成员变量 public Fanxing(){}//空参构造 public Fanxing(T age) {//有参构造 this.age = age; } public T getAge() {//定义泛型方法 return age; } public void setAge(T age) {//定义泛型方法 this.age = age; } }
测试类:
package demo_practice; public class DemoFanxing { public static void main(String[] args) { Fanxing <String> foo1 = new Fanxing<>(); Fanxing <Integer> foo2 = new Fanxing<>(); foo1.setAge("23"); System.out.println(foo1.getAge()); foo2.setAge(23); System.out.println(foo2.getAge()); } }
说明:
在泛型类的实例化的过程中,实际类型必须是引用类型;
一个方法是否是泛型方法与它所在的类是否是泛型类没有关系
泛型方法:
定义方式:【修饰符】 <T> 返回值类型 (T 参数)
实例:
package demo_practice; public class Fanxing1 { private String name; public Fanxing1(String name) { this.name = name; } public Fanxing1(){} public String getName() { return name; } public void setName(String name) { this.name = name; } public <E> void print(E e){ System.out.println(e); } }
测试类:
package demo_practice; public class Demofanxing1 { public static void main(String[] args) { Fanxing1 foo = new Fanxing1(); foo.print("我是中国人!"); } }
说明;
在定义泛型方法时,返回值和至少一个参数类型时泛型,而且类型应该是一致的,,所以推荐使用返回值类型和参数类型都一致的泛型方法。
在调用泛型方法时,foo1.print("I am a Chinese")和foo1.<String>print("I am a Chinese")的作用时一致的
泛型类中具有泛型方法:
实例:
package demo_practice; public class Fanxing2 <T> { private T age; public Fanxing2(){} public Fanxing2(T age) { this.age = age; } public T getAge() { return age; } public void setAge(T age) { this.age = age; } public <E> void print(E e){ System.out.println("泛型类的类型参数"+age.getClass().getName()); System.out.println("泛型方法的类型参数"+e.getClass().getName()); } }
测试类:
package demo_practice; public class Demofanxing2 { public static void main(String[] args) { Fanxing2<Integer> f = new Fanxing2<>(); f.setAge(23); f.print("医学生"); } }
结果为:
限制泛型的可用对象:
对于泛型,Java也可以有一个限制,例如T必须是某个类的子类,就必须用extends,而不是implements
泛型不存在父子类的关系
泛型的通配符的概念:
通配符?的意义是:某个类是该类的子类或者是某个接口的实现类,具体是什么类型不知道。
例如:泛型类名 <? extends List> obj = null;
泛型经常与容器一起使用!!记住这一点就可以了