泛型就是将具体的类型参数化,将类型定义成参数形式,等到使用的时候再传入具体的类型。泛型可以使用在类、接口和方法中。
泛型的优势:
①编译时检查代码的类型安全,从而减少出错的概率;
②消除了强制类型转换,没有泛型的返回值,我们可以认为是一个Object,在使用时需要对其进行强制转换,这样就可能会出现ClassCastException(类型转换异常)。
定义格式:修饰符 class 类名<泛型变量>{ }。
/** * @description: 动物类 * @author: Murphy * @date: 2020/7/37:41 上午 */ public class Animal<T> { public void method(T t) { System.out.println(t.getClass()); } } /** * @description: 狗类 * @author: Murphy * @date: 2020/7/37:43 上午 */ public class Dog { } /** * @description: 测试类 * @author: Murphy * @date: 2020/7/37:44 上午 */ public class Demo { public static void main(String[] args) { Animal<Dog> animal = new Animal<>(); animal.method(new Dog()); } }泛型类在创建对象时确定泛型。
定义格式:修饰符 <泛型变量> 返回值类型 方法名(参数) {方法体}。
public void method(T t) { System.out.println(t.getClass()); }泛型方法在调用方法时确定泛型。
定义格式:修饰符 interface 接口名 <泛型变量> { }。
/** * @description: 商品接口 * @author: Murphy * @date: 2020/7/38:10 上午 */ public interface GoodsInterface<E> { public abstract void method(E e); } 定义类时确定泛型 /** * @description: 商品接口的实现类 * @author: Murphy * @date: 2020/7/38:12 上午 */ public class Goods implements GoodsInterface<String> { @Override public void method(String e) { System.out.println(e); } } 创建对象时确定泛型的类型 /** * @description: 商品接口的实现类 * @author: Murphy * @date: 2020/7/38:12 上午 */ public class Goods<E> implements GoodsInterface<E> { @Override public void method(E e) { System.out.println(e); } } /** * @description: 测试类 * @author: Murphy * @date: 2020/7/37:44 上午 */ public class Demo { public static void main(String[] args) { Goods<String> goods = new Goods<>(); goods.method("创建对象时确定泛型"); } }E(Element):元素;
T(Type):类型;
K(Key):键值;
V(Value):Value值;
?:泛型通配符,代表一切类型,能接受一切但不能修改。
泛型的上限:
<? extends String>:只能接收String类及其子类。
泛型的下限:
<? super String>:只能接收String类及其父类。