泛型与面向接口编程

没有泛型的集合像没贴标签的快递箱:能装,但容易拿错。本周把 类型安全面向接口 再夯实一层。

泛型:把类型当参数

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手记
学习是第一生产力。

posted @ 2026-08-06 15:39  Eden手记  阅读(0)  评论(0)    收藏  举报