C++ Templates và Java Generics đều hỗ trợ lập trình tổng quát (generic programming) nhưng có khác biệt căn bản:
C++ Templates
- Compile-time code generation: trình biên dịch sinh mã riêng cho mỗi lần khởi tạo (instantiation).
- Hỗ trợ tham số non-type (số nguyên, con trỏ...).
- Template meta-programming, đặc biệt hóa đầy đủ.
- Không có type erasure.
Java Generics
- Type erasure: thông tin kiểu bị xóa sau compile, bytecode giống code non-generic.
- Chỉ hỗ trợ tham số kiểu tham chiếu (reference types), không hỗ trợ primitive (int, double...).
- An toàn kiểu tại compile-time, loại bỏ ép kiểu.
- Không hỗ trợ đặc biệt hóa (specialization) như C++.
Ví dụ C++ Template
template <typename T>
T const& Max(T const& a, T const& b) { return a < b ? b : a; }
Ví dụ Java Generic Method
public static <E> void printArray(E[] arr) {
for (E e : arr) System.out.print(e + " ");
System.out.println();
}
Bảng so sánh tóm tắt
| Đặc điểm | C++ Templates | Java Generics |
|---|---|---|
| Code generation | Mỗi instantiation → class mới | Type erasure → một class chung |
| Tham số non-type | Có | Không |
| Primitive types | Hỗ trợ trực tiếp | Chỉ wrapper classes |
| Specialization | Full/partial | Không |
| Runtime overhead | Không (compile-time) | Có (cast ngầm) |