今天我们讲一下泛型在实际开发中的应用.在开发中我们一般在定义的时候不知道是什么类型,但是使用的时候会知道具体的类型.这时候我们就用泛型.泛型的应用大体分为三种,一种是定义在类上的泛型,一种是定义在方法上的泛型,一种是定义在接口上的泛型.下面我们分别介绍一下这三种用法.
首先,先来看第一种,也是最常见的一种,定义在类上的泛型.格式就是在类名后边加上一个<T>,只要在类上声明了.在类中就可以使用这种未知的类型.字母T可以是任意的字母或者字符串.
[AppleScript] 纯文本查看 复制代码 public class Demo<T> {
private T t;
public void setT(T t){
this.t = t;
}
public T getT(){
return t;
}
}
创建对象使用的时候,要在类型后边声明称具体的类型:[AppleScript] 纯文本查看 复制代码 // 泛型类的使用 就是说什么时候确定泛型的具体类型
// 创建对象的时候
Demo<String> d = new Demo<>();
d.setT("hello");
String t = d.getT();
System.out.println(t);
Demo<Integer> d2 = new Demo<>();
d2.setT(123);
System.out.println(d2.getT());
接下来我们看一下如何在方法上声明泛型:
[AppleScript] 纯文本查看 复制代码 /*
定义一个带有泛型的方法
定义一个方法 传一个类型的对象进来 输出它的运行时类也就是调用 getClass()
*/
public <T> void show(T t){//T 代表泛型 代表未知的数据类型 未来传递的数据类型 传什么是什么
System.out.println(t.getClass());
}
使用的时候,出入的是什么类型,获取出来的就是什么类型.
[AppleScript] 纯文本查看 复制代码 //使用带有泛型方法
// 在调用方法的时候 确定了泛型的具体类型
// 创建对象
Demo d = new Demo();
d.show("ahkla");
d.show(12.3);
最后我们来看一下如何在接口上定义泛型和使用.先来看定义,跟在类上面定义是一样的:
[AppleScript] 纯文本查看 复制代码 public interface GenericInterface<E> {
public abstract void add(E e);
public abstract E get();
}
实现带有泛型的接口有两种方式.一种是在实现接口的时候就知道了要使用的类型.这时候,实现类中就不用再声明泛型:
[AppleScript] 纯文本查看 复制代码 public class GenericImp implements GenericInterface<String>{
@Override
public void add(String s) {
}
@Override
public String get() {
return null;
}
}
一种是在定义接口的实现类的时候,不能确定具体使用的是什么类型.这时候就要在实现类上也声明上泛型:
[AppleScript] 纯文本查看 复制代码 public class GenericImp2<E> implements GenericInterface<E>{
@Override
public void add(E e) {
}
@Override
public E get() {
return null;
}
}
这种情况,就要在具体创建对象的时候,去确定具体使用的类型:
[AppleScript] 纯文本查看 复制代码 public static void main(String[] args) {
GenericImp2<String> list = new GenericImp2<>();
list.add("aaa");
String s = list.get();
}
|