Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

So sánh Templates (C++) và Generics (Java)


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ểmC++ TemplatesJava Generics
Code generationMỗi instantiation → class mớiType erasure → một class chung
Tham số non-typeCóKhông
Primitive typesHỗ trợ trực tiếpChỉ wrapper classes
SpecializationFull/partialKhông
Runtime overheadKhông (compile-time)Có (cast ngầm)