泛型踩坑
泛型是一种在编程语言中用来创建可重用代码的机制。它允许您编写函数、类、接口等,而不需要提前指定具体的数据类型,从而实现代码的通用性和灵活性。通过使用泛型,您可以编写更加通用、安全和易于维护的代码。
1. 泛型的定义
泛型是一种参数化类型的概念,允许您在编写代码时定义类、接口或方法可以操作的数据类型。通过泛型,您可以编写通用的代码,使其能够适用于多种数据类型,而不需要为每种数据类型都编写特定的代码。
2. 泛型的优势
代码重用性:通过泛型,您可以编写一次代码,然后在多种数据类型上重复使用,避免了重复编写类似的代码。 类型安全:泛型能够在编译时进行类型检查,避免了在运行时出现类型转换错误,提高了代码的可靠性。 减少代码冗余:使用泛型可以减少冗余代码的编写,使代码更加简洁和易于维护。 增强代码的可读性和可维护性:泛型代码通常更具有可读性,因为它们清晰地表明了代码的意图和用途。
3. 泛型的应用场景
集合类:Java中的集合类(如List、Set、Map等)都使用了泛型,使得集合能够存储特定类型的元素。 类和接口:您可以定义泛型类和接口,以便在实例化时指定具体的类型。 方法:泛型方法允许您在方法中使用泛型类型,从而实现更通用的方法。
4. 泛型的工作原理
在Java中,泛型是通过类型擦除来实现的,即在编译时会擦除泛型类型信息,将泛型类型替换为其边界类型(或Object类型)。这样可以确保向后兼容性,并在运行时不会保留泛型类型信息。
5. 踩坑
理解了以上知识后,我们进入本文的重要环节。先来说下博主遇到的问题。先上代码:
/** *接口 **/ public interface MenberService<T> { List<T> search(Class cls, SearchRequest searchRequest); public int deleteBatch(List<String> ids); }
/** *实现类 **/ public class MenberServiceImpl implements MenberService { List<T> search(Class cls, SearchRequest searchRequest){ //此处省略了方法体 return null; } public int deleteBatch(List<String> ids){ //此处省略了方法体 return 0; } }
代码看上去是没什么问题,但是如果在开发工具中就会看到实现类报错了,
报错中可以看出由于泛型类型未被正确指出,导致入参中的泛型类型被擦除后也无法被编译器识别。
5. 解决方法
在实现类中需要指明实现类中的泛型类型,因为T是一个泛指,在编译后会被替换成实际的类型。这里我们先指定成Object,方法如下
/** *实现类 **/ public class MenberServiceImpl implements MenberService<Object> { List<T> search(Class cls, SearchRequest searchRequest){ //此处省略了方法体 return null; } public int deleteBatch(List<String> ids){ //此处省略了方法体 return 0; } }
这样,编译器是可以直达我们类中的泛型为Object,所以在方法的入参中我们是可以指定其他类型的泛型。