Generics là một chức năng của Java giúp cho lập trình viên có thể chỉ định rõ kiểu dữ liệu mà họ muốn làm việc với một class, một interface hay một phương thức nào đó. Trong bài viết này, chúng ta hãy cùng tìm hiểu thêm về generics trong Java các bạn nhé!
Tóm Tắt
Tại sao lại cần generics?
Trước khi generics được giới thiệu, chúng ta chỉ làm việc với class, interface hay phương thức với một kiểu dữ liệu cố định.
Ví dụ, chúng ta khai báo một đối tượng List như sau:
1
List
l
=
new
ArrayList
(
2
)
;
Với khai báo trên, giả định rằng chúng ta mong muốn chỉ làm việc với đối tượng String. Nhưng bởi vì biến l là một Collection của những đối tượng Object nên chúng ta có thể sử dụng nó với bất kỳ kiểu dữ liệu nào. Khai báo sau sẽ hợp lệ:
1
2
l
.
add
(
“Khanh”
)
;
l
.
add
(
new
Integer
(
1
)
)
;
Điều này sẽ gây nhập nhằng kiểu dữ liệu mà chúng ta muốn làm việc và đôi khi chúng ta cũng không kiểm soát được hết ở thời điểm compile time.
Đó là nguyên nhân của sự cần thiết phải có của generics trong Java. Với generics, chúng ta sẽ chỉ định kiểu dữ liệu mà chúng ta sẽ làm việc ngay thời điểm compile time luôn.
Ví dụ trên có thể viết lại như sau:
1
List
<String>
l
=
new
ArrayList
<String>
(
2
)
;
khi đó, khai báo sau sẽ báo lỗi ngay:
1
l
.
add
(
new
Integer
(
1
)
)
;
Cách tạo một generics class trong Java
Đầu tiên, các bạn hãy cùng mình định nghĩa một non-generics class trước rồi sau đó sẽ chuyển class này qua generics class nhé!
Nội dung của non-generics class như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
package
com
.
huongdanjava
;
class
Student
{
private
Object
obj
;
public
void
set
(
Object
obj
)
{
this
.
obj
=
obj
;
}
public
Object
get
(
)
{
return
obj
;
}
}
Với định nghĩa như thế này, thuộc tính obj của đối tượng Student và tham số obj trong phương thức set() có thể là bất kỳ đối tượng nào. Và nếu 2 đối tượng này là khác nhau, một exception sẽ xảy ra ngay.
Để cố định kiểu dữ liệu cho thuộc tính obj và cả trong phương thức set(), chúng ta sẽ áp dụng generics trong Java. Cụ thể như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
package
com
.
huongdanjava
;
class
Student
<T>
{
private
T
obj
;
public
void
set
(
T
obj
)
{
this
.
obj
=
obj
;
}
public
T
get
(
)
{
return
obj
;
}
}
Sử dụng generics class
Để sử dụng generics class, khi khởi tạo đối tượng, chúng ta sẽ truyền kiểu dữ liệu mà chúng ta muốn vào đối tượng đó.
Lấy ví dụ Student bên trên, chúng ta có thể khởi tạo đối tượng Student cùng với kiểu dữ liệu String như sau:
1
Student
<String>
student
=
new
Student
<String>
(
)
;
Lúc này, chúng ta không thể sử dụng phương thức set() với kiểu dữ liệu khác String, ví dụ: