泛型与面向接口编程
没有泛型的集合像没贴标签的快递箱:能装,但容易拿错。本周把 类型安全 和 面向接口 再夯实一层。
泛型:把类型当参数
public class Box<T> {
private T value;
public void set(T value) { this.value = value; }
public T get() { return value; }
}
Box<String> box = new Box<>();
box.set("Eden");
String v = box.get(); // 不需要强转
List<Student> 里的 <Student> 就是泛型参数:编译期帮你拦住「把 Course 塞进学生列表」。
泛型方法
public static <T> void printAll(List<T> list) {
for (T t : list) {
System.out.println(t);
}
}
equals 与 hashCode(和 Map/Set 强相关)
public class Student {
private String studentId;
private String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Student s)) return false;
return Objects.equals(studentId, s.studentId);
}
@Override
public int hashCode() {
return Objects.hash(studentId);
}
}
规则:equals 相等的对象,hashCode 必须相等。 否则 HashMap/HashSet 会行为怪异。
面向接口:依赖契约,不依赖实现
public interface IdGenerator {
String nextId();
}
public class UuidGenerator implements IdGenerator {
public String nextId() {
return UUID.randomUUID().toString();
}
}
public class StudentService {
private final IdGenerator idGenerator;
public StudentService(IdGenerator idGenerator) {
this.idGenerator = idGenerator;
}
}
StudentService 不关心 ID 怎么生成,只关心「能给我一个 ID」。这正是后面 Spring 依赖注入的思想雏形。
本周练习清单
写在最后
泛型让代码更安全,接口让代码更灵活。两者都是「从能跑」走向「能长大」。
下周:并发基础——程序开始学会同时干几件事。
YoungGc · Eden手记
学习是第一生产力。
如发现有错误欢迎指正,欢迎交流,接受反驳。 -- by不为 :)

浙公网安备 33010602011771号