Nó thực sự đơn giản. Đây là một tính năng mới được giới thiệu trong J2SE 5 . Chỉ định dấu ngoặc nhọn sau tên lớp có nghĩa là bạn đang tạo kiểu dữ liệu tạm thời có thể chứa bất kỳ loại dữ liệu nào.
Thí dụ:
class A<T>{
T obj;
void add(T obj){
this.obj=obj;
}
T get(){
return obj;
}
}
public class generics {
static<E> void print(E[] elements){
for(E element:elements){
System.out.println(element);
}
}
public static void main(String[] args) {
A<String> obj=new A<String>();
A<Integer> obj1=new A<Integer>();
obj.add("hello");
obj1.add(6);
System.out.println(obj.get());
System.out.println(obj1.get());
Integer[] arr={1,3,5,7};
print(arr);
}
}
Thay vì <T>
, bạn thực sự có thể viết bất cứ điều gì và nó sẽ hoạt động theo cùng một cách. Hãy thử viết <ABC>
tại chỗ <T>
.
Điều này chỉ để thuận tiện:
<T>
được gọi là bất kỳ loại
<E>
như kiểu phần tử
<N>
như loại số
<V>
như giá trị
<K>
làm chìa khóa
Nhưng bạn có thể đặt tên cho nó bất cứ điều gì bạn muốn, nó không thực sự quan trọng.
Hơn nữa, Integer
, String
, Boolean
vv là lớp wrapper của Java mà giúp đỡ trong việc kiểm tra các loại quá trình biên dịch. Ví dụ, trong đoạn mã trên, obj
có kiểu String
, vì vậy bạn không thể thêm bất kỳ loại nào khác vào nó (thử obj.add(1)
, nó sẽ báo lỗi). Tương tự, obj1
là Integer
loại, bạn không thể thêm bất kỳ loại nào khác vào nó (thử obj1.add("hello")
, lỗi sẽ ở đó).
T createObject
cho là ở bên trong Pool hoặc PoolFactory? Nơi nào đượcthis.freeObjects = ...
cho là? Đó có phải là một ví dụ riêng biệt? Nó là bất hợp pháp để có nó ở đó; nó phải ở trong một phương thức