问题提出
这个是在阅读一些源码的时候提出的疑问。java的一个特性,泛型,这个顾名思义就是广泛包含的一种类型。不过深入一点就不知所以然了。
知识回顾
Java 泛型详解(超详细的java泛型方法解析) 泛型提出是为了解决编译的时候产生的对象不匹配的问题的。
关键字:T ,可以理解为type类型。
使用缘由
避免编译的时候发生强转换导致的ClassCastException 的问题。
泛型主要分为以下三大类:泛型类、泛型方法、泛型接口
代码解析
- 类:
/**
* @param <T> 这里解释下<T>中的T:
* 此处的T可以随便写为任意标识,常见的有T、E等形式的参数表示泛型
* 泛型在定义的时候不具体,使用的时候才变得具体。
* 在使用的时候确定泛型的具体数据类型。即在创建对象的时候确定泛型。
*/
public class GenericsClassDemo<T> {
//t这个成员变量的类型为T,T的类型由外部指定
private T t;
//泛型构造方法形参t的类型也为T,T的类型由外部指定
public GenericsClassDemo(T t) {
this.t = t;
}
//泛型方法getT的返回值类型为T,T的类型由外部指定
public T getT() {
return t;
}
}
<T>
是最关键的!可以简单将其理解为一个占位符。
使用
Generic<String> genericString = new Generic<String>("helloGenerics");
- 方法:
/**
*
* @param t 传入泛型的参数
* @param <T> 泛型的类型
* @return T 返回值为T类型
* 说明:
* 1)public 与 返回值中间<T>非常重要,可以理解为声明此方法为泛型方法。
* 2)只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
* 3)<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
* 4)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E等形式的参数常用于表示泛型。
*/
public <T> T genercMethod(T t){
System.out.println(t.getClass());
System.out.println(t);
return t;
}
- 接口
/**
* 定义一个泛型接口
*/
public interface GenericsInteface<T> {
public abstract void add(T t);
}
通配符以及上下限
<?>
是关键。