下面从实战角度系统讲一下 Java 泛型(Generics)怎么用,不堆概念,直接上场景和代码。
没有泛型:
List list = new ArrayList();
list.add("abc");
String s = (String) list.get(0); // 强制转换,容易出错
有泛型:
List<String> list = new ArrayList<>();
list.add("abc");
String s = list.get(0); // 安全、清晰
✅ 好处:
场景:写一个通用的“容器 / 返回结果 / 缓存”
public class Result<T> {
private int code;
private String msg;
private T data;
public Result(int code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
// getter / setter
}
使用:
Result<String> r1 = new Result<>(200, "ok", "success");
Result<User> r2 = new Result<>(200, "ok", new User());
✅ 实战场景:
场景:工具类,不依赖类泛型
public class JsonUtils {
public static <T> T parse(String json, Class<T> clazz) {
// 伪代码
return JSON.parseObject(json, clazz);
}
}
使用:
User user = JsonUtils.parse(jsonStr, User.class);
✅ 实战场景:
public interface Repository<T> {
T findById(Long id);
void save(T entity);
}
实现:
public class UserRepository implements Repository<User> {
public User findById(Long id) { ... }
public void save(User user) { ... }
}
✅ 实战场景:
public void printList(List<?> list) {
for (Object o : list) {
System.out.println(o);
}
}
public void sum(List<? extends Number> list) {
double s = 0;
for (Number n : list) {
s += n.doubleValue();
}
}
public void addNumbers(List<? super Integer> list) {
list.add(1);
}
✅ 记忆口诀:
T[] arr = new T[10]; // 编译错误
✅ 正确方式:
T[] arr = (T[]) new Object[10];
List<int> list; // 错误
✅ 用包装类:
List<Integer> list;
List<String> a = new ArrayList<>();
List<Integer> b = new ArrayList<>();
a.getClass() == b.getClass(); // true
✅ 实战影响:
instanceof Tnew T()public class ApiResponse<T> {
private int code;
private String message;
private T data;
}
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private Repository<User> repository;
}
实战优先级:
如果你愿意,我可以:
你更想看哪一种?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。