面试题答案
一键面试泛型接口设计
-
定义泛型接口
public interface UserData<T> { T getUserData(); void setUserData(T data); }
在上述代码中,
<T>
是泛型类型参数。这个接口定义了获取和设置用户数据的方法,T
代表具体的用户数据类型,如学生数据类型Student
或教师数据类型Teacher
。 -
具体实现类 以学生数据为例:
class Student { private String name; private int age; // 构造函数、getter和setter方法省略 } class StudentUserData implements UserData<Student> { private Student student; public StudentUserData(Student student) { this.student = student; } @Override public Student getUserData() { return student; } @Override public void setUserData(Student data) { this.student = data; } }
相比传统接口的优势和独特之处
-
类型安全
- 传统接口在处理不同类型数据时,通常需要使用
Object
类型来接收和返回数据。这会导致类型转换的潜在风险,运行时可能抛出ClassCastException
。 - 泛型接口通过类型参数化,在编译期就确保了类型的正确性,避免了运行时类型转换错误。例如,
UserData<Student>
接口实现类只能处理Student
类型的数据,编译器会检查相关操作的类型匹配。
- 传统接口在处理不同类型数据时,通常需要使用
-
代码复用
- 传统接口针对不同的数据类型需要编写多个相似的接口和实现类。例如,为学生和教师分别编写
StudentDataInterface
和TeacherDataInterface
,导致代码冗余。 - 泛型接口通过参数化类型,可以复用同一套接口和实现逻辑来处理多种不同类型的数据。如上述
UserData
接口及其实现类可以处理Student
、Teacher
等多种用户数据类型,提高了代码的复用性。
- 传统接口针对不同的数据类型需要编写多个相似的接口和实现类。例如,为学生和教师分别编写
-
可读性和可维护性
- 泛型接口使代码更清晰地表达其意图。例如,
UserData<Student>
明确表示该接口用于处理学生用户数据,相比传统接口中使用Object
类型,代码的可读性大大提高。 - 在维护代码时,由于类型安全和代码复用,修改和扩展代码更加容易。比如要增加一种新的用户类型,只需创建新的具体类型并实现泛型接口,而不需要大量重复编写相似的接口和实现代码。
- 泛型接口使代码更清晰地表达其意图。例如,