Máy vi tínhLập trình

Generics Java: Mô tả và Phương pháp

Từ khi bắt đầu, ngôn ngữ Java đã trải qua rất nhiều thay đổi, điều mà chắc chắn mang lại những tính năng tích cực cho tính năng của nó. Một thay đổi quan trọng như vậy là việc giới thiệu Java Generic hay khái quát. Chức năng này đã làm cho ngôn ngữ không chỉ linh hoạt hơn và linh hoạt, mà còn an toàn hơn nhiều về giảm loại dữ liệu.

Thực tế là trước khi đưa ra các Generics, mã chung chung trong Java có thể được tạo ra, chỉ với các liên kết của Object kiểu. Liên kết như vậy có thể được gán cho bất kỳ đối tượng. Sau khi tất cả, tất cả các lớp học trong Java là hậu duệ tiềm ẩn của lớp Object. Tuy nhiên, cách tiếp cận này là một nguồn tiềm năng của nhiều lỗi an toàn khi bạn chuyển đổi một đối tượng từ đối tượng sang kiểu mục tiêu. Khi khái quát hoá được sử dụng, tất cả các phôi được thực hiện ngầm và tự động, điều này loại trừ khả năng xảy ra lỗi.

Generics Java: mô tả và ví dụ

Hãy để chúng tôi kiểm tra một ví dụ đơn giản của việc áp dụng khái quát vào lớp thông thường trong hình bên dưới. Và chỉ sau đó chúng tôi sẽ tiến hành một cuộc kiểm tra chi tiết về tất cả các subtleties và sắc thái của Java Generic.

Lưu ý cách lớp Par được khai báo. Ngay sau tên lớp, các dấu ngoặc góc được mở ra, trong đó chữ T. Được chỉ định. Nó là một kiểu giữ chỗ sẽ được thay thế bằng một kiểu cụ thể khi tạo một thể hiện của lớp này. Dường như thế này: Pair obj = new Pair (). Cần lưu ý rằng thay vì T, bạn có thể chỉ định bất kỳ chữ cái, nhưng, như một quy luật, sử dụng T, V hoặc E.

Lưu ý: Bắt đầu với phiên bản thứ tám của Java, xác định loại mục tiêu khi liên kết được khai báo, bạn có thể để khung hình trong nhà xây dựng trống. Vì vậy, ví dụ trên có thể được viết lại như sau: Pair obj = new Pair <> ().

Khi một lớp được khai báo theo cách đó, sau đó trong cơ thể, thay vì các loại trường cụ thể, tài liệu tham khảo, và các phương thức trả về bằng phương thức, bạn có thể sử dụng chữ cái này. Bởi vì T được thay thế bởi một kiểu cụ thể khi tạo một đối tượng lớp, các trường đầu tiên và thứ hai trong trường hợp này sẽ là loại Integer.

Theo logic, các đối số firstItem và secondItem, được chuyển tới constructor tương ứng, cũng phải là kiểu Integer hoặc lớp con của nó. Nếu bạn cố vượt qua một kiểu dữ liệu khác với những gì được chỉ định khi đối tượng được tạo, trình biên dịch sẽ không bỏ qua lỗi này. Vì vậy, constructor với các đối số khi tạo đối tượng sẽ có dạng sau: Pair obj = new Pair <> (new Integer (1), new Integer (2)). Tương tự cũng áp dụng cho các đối số cho phương thức setFirst và setSecond. Và như bạn có thể đã đoán, các phương thức getFirst và getSecond sẽ trả về giá trị của kiểu Integer.

Một lớp chung với một số tham số kiểu

Trong các lớp chung chung, bạn cũng có thể khai báo một số tham số kiểu được xác định trong các dấu ngoặc góc, được phân tách bằng dấu phẩy. Lớp Đối sánh cho trường hợp này được trình bày trong hình bên dưới.

Như bạn thấy, khi tạo một thể hiện của một lớp như vậy, cùng một số loại như các tham số nên được chỉ định trong các dấu ngoặc góc. Nếu bạn đã quen thuộc với loại cấu trúc dữ liệu như Map, thì bạn có thể nhận thấy rằng cùng một nguyên tắc được sử dụng ở đó. Ở đó, đối số đầu tiên xác định kiểu của khóa, và thứ hai xác định kiểu của giá trị. Cần lưu ý rằng các loại đối số được truyền cho việc tạo đối tượng có thể giống nhau. Vì vậy, tuyên bố sau đây của một thể hiện của lớp Pair là hoàn toàn chính xác: Pair obj.

Một số tính năng của tổng quát

Trước khi tiếp tục, cần lưu ý rằng trình biên dịch Java không tạo ra bất kỳ phiên bản khác của lớp Pair. Trong thực tế, trong quá trình biên dịch, tất cả thông tin về loại chung chung sẽ bị xóa. Thay vào đó, các kiểu tương ứng được cast, tạo ra một phiên bản đặc biệt của lớp Pair. Tuy nhiên, chính chương trình vẫn có một phiên bản tổng quát duy nhất của lớp này. Quá trình này được gọi là trong Làm sạch loại chung của Java.

Chúng ta hãy chú ý một điểm quan trọng. Liên kết tới các phiên bản khác nhau của cùng một lớp java generic không thể trỏ đến cùng một đối tượng. Nghĩa là chúng ta có hai liên kết: Pair obj1 và Pair obj2. Vì vậy, một lỗi xảy ra trong dòng obj1 = obj2. Mặc dù cả hai biến là kiểu cặp , các đối tượng mà chúng tham chiếu là khác nhau. Đây là một ví dụ sống động về tính bảo mật của các kiểu trong Java Generic.

Các hạn chế đối với các lớp tổng quát

Điều quan trọng là biết rằng generalizations chỉ có thể được áp dụng cho các loại tài liệu tham khảo, nghĩa là, đối số được truyền cho đối số java chung lớp nhất thiết phải là kiểu của lớp. Những loại đơn giản như, ví dụ, đôi hoặc dài, không thể truyền được. Nói cách khác, dòng sau của khai báo lớp Pair là không hợp lệ: cặp obj. Tuy nhiên, giới hạn này không phải là một vấn đề nghiêm trọng, vì Java có một lớp wrapper tương ứng cho mỗi loại nguyên thủy. Nói cách nghiêm túc, nếu bạn muốn đóng gói một số nguyên và một giá trị logic trong lớp Pair, gói tự động sẽ làm mọi việc cho bạn: Pair obj = new Pair <> (25, true).

Một hạn chế nghiêm trọng khác là không thể tạo ra một thể hiện của một tham số kiểu. Vì vậy, dòng sau sẽ gây ra lỗi biên dịch: T first = new T (). Điều này là hiển nhiên, vì bạn không biết trước cho dù một lớp đầy đủ hoặc một giao diện trừu tượng sẽ được thông qua như một đối số. Cũng vậy khi tạo mảng.

Loại hạn chế

Khá thường có những tình huống khi nó là cần thiết để hạn chế danh sách các loại có thể được truyền như là một đối số cho lớp chung chung java. Giả sử rằng trong lớp Pair của chúng ta, chúng ta chỉ muốn đóng gói các giá trị số cho các phép toán toán học tiếp theo. Để làm điều này, chúng ta cần phải thiết lập các ràng buộc trên của tham số kiểu. Điều này được thực hiện bằng cách khai báo lớp kế thừa bởi tất cả các đối số được truyền trong các dấu ngoặc góc. Nó sẽ giống như thế này: class Pair . Bằng cách này, trình biên dịch học rằng thay vì tham số T, bạn có thể thay thế hoặc là lớp Số hoặc một trong các lớp con của nó.

Đây là một kỹ thuật phổ biến. Các hạn chế như vậy thường được sử dụng để đảm bảo tính tương thích của các tham số kiểu trong cùng một lớp. Xem xét một ví dụ về lớp Pair của chúng ta: class Pair . Ở đây chúng ta nói trình biên dịch kiểu T có thể là tùy ý, và kiểu V phải là kiểu T hoặc một trong các lớp con của nó.

Hạn chế "từ dưới lên" diễn ra theo cùng một cách, nhưng thay vì từ mở rộng, từ siêu được viết ra. Nghĩa là, việc tuyên bố cặp lớp chỉ ra rằng thay vì T, hoặc là một ArrayList hoặc bất kỳ lớp hoặc giao diện nào mà nó thừa kế đều có thể được thay thế.

Các phương thức Java Generator và Các công trình xây dựng

Trong tổng thể Java có thể được áp dụng không chỉ đối với các lớp, mà còn các phương pháp. Vì vậy, phương pháp tổng quát có thể được khai báo trong lớp thông thường.

Như bạn thấy trong hình trên, không có gì phức tạp trong việc khai báo phương pháp tổng quát. Chỉ cần đặt các dấu ngoặc góc trước phương thức trả về và chỉ định các tham số kiểu trong chúng.

Trong trường hợp của một nhà xây dựng, mọi thứ được thực hiện trong cùng một cách:

Angle brackets trong trường hợp này được đặt trước tên của constructor, vì nó không trả về bất kỳ giá trị nào. Kết quả của công việc của cả hai chương trình sẽ là:

Số nguyên

Chuỗi

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 vi.delachieve.com. Theme powered by WordPress.