Groovy - Generics
Generics cho phép các kiểu (lớp và giao diện) trở thành tham số khi định nghĩa các lớp, giao diện và phương thức. Giống như các tham số hình thức quen thuộc hơn được sử dụng trong khai báo phương thức, tham số kiểu cung cấp một cách để bạn sử dụng lại cùng một mã với các đầu vào khác nhau. Sự khác biệt là đầu vào cho tham số chính thức là giá trị, trong khi đầu vào cho tham số kiểu là kiểu.
Chung cho Bộ sưu tập
Các lớp bộ sưu tập như lớp Danh sách có thể được tổng quát hóa để chỉ các bộ sưu tập thuộc loại đó được chấp nhận trong ứng dụng. Dưới đây là một ví dụ về ArrayList tổng quát. Những gì câu lệnh sau đây thực hiện là nó chỉ chấp nhận các mục danh sách có kiểu chuỗi:
List<String> list = new ArrayList<String>();
Trong ví dụ mã sau, chúng tôi đang làm như sau:
- Tạo một bộ sưu tập ArrayList tổng quát sẽ chỉ chứa các Chuỗi.
- Thêm 3 chuỗi vào danh sách.
- Đối với mỗi mục trong danh sách, in giá trị của các chuỗi.
class Example {
static void main(String[] args) {
// Creating a generic List collection
List<String> list = new ArrayList<String>();
list.add("First String");
list.add("Second String");
list.add("Third String");
for(String str : list) {
println(str);
}
}
}
Đầu ra của chương trình trên sẽ là:
First String
Second String
Third String
Các lớp tổng quát
Toàn bộ lớp cũng có thể được khái quát hóa. Điều này làm cho lớp linh hoạt hơn trong việc chấp nhận bất kỳ loại nào và làm việc phù hợp với các loại đó. Hãy xem một ví dụ về cách chúng ta có thể thực hiện điều này.
Trong chương trình sau, chúng tôi sẽ thực hiện các bước sau:
Chúng tôi đang tạo một lớp có tên là ListType. Lưu ý các từ khóa <T> được đặt trước định nghĩa lớp. Điều này cho trình biên dịch biết rằng lớp này có thể chấp nhận bất kỳ kiểu nào. Vì vậy, khi chúng ta khai báo một đối tượng của lớp này, chúng ta có thể chỉ định một kiểu trong khi khai báo và kiểu đó sẽ được thay thế trong trình giữ chỗ <T>
Lớp chung có các phương thức getter và setter đơn giản để làm việc với biến thành viên được định nghĩa trong lớp.
Trong chương trình chính, lưu ý rằng chúng ta có thể khai báo các đối tượng của lớp ListType, nhưng thuộc các kiểu khác nhau. Cái đầu tiên thuộc loại Integer và cái thứ hai thuộc loại String.
class Example {
static void main(String[] args) {
// Creating a generic List collection
ListType<String> lststr = new ListType<>();
lststr.set("First String");
println(lststr.get());
ListType<Integer> lstint = new ListType<>();
lstint.set(1);
println(lstint.get());
}
}
public class ListType<T> {
private T localt;
public T get() {
return this.localt;
}
public void set(T plocal) {
this.localt = plocal;
}
}
Đầu ra của chương trình trên sẽ là:
First String
1