1. Cách dùng từ kháo 'out' khi khai báo generic
abstract class Source <out T> { abstract fun nextT(): T } fun demo(strs: Source <String>) { val objects: Source <Any> = strs // This is OK, since T is an out-parameter }
Nếu không có từ khoá 'out', trình biên dịch sẽ thông báo lỗi "Type mismatch: inferred type is Source but Source was expected "
2. Cách dùng từ kháo 'in' khi khai báo generic
Trường hợp khai báo với 'in' thì T chỉ được dùng như là tham số đầu vào của hàm, không được khai báo dạng trả về return.
Ví dụ:
abstract fun nextT(): T
Trình biên dịch báo lỗi "Type parameter T is declared as 'in' but occurs in 'out' position in type T"
Có thể sử dụng bằng cách như thế này:
abstract fun nextT(input: T)
==================
Tóm lại:
"When we want to assign the generic type to any of its super type, then we need to use “out” keyword, and when we want to assign the generic type to any of its sub-type, then we need to use “in” keyword."
abstract class Source <out T> { abstract fun nextT(): T } fun demo(strs: Source <String>) { val objects: Source <Any> = strs // This is OK, since T is an out-parameter }
Nếu không có từ khoá 'out', trình biên dịch sẽ thông báo lỗi "Type mismatch: inferred type is Source
2. Cách dùng từ kháo 'in' khi khai báo generic
Trường hợp khai báo với 'in' thì T chỉ được dùng như là tham số đầu vào của hàm, không được khai báo dạng trả về return.
Ví dụ:
abstract fun nextT(): T
Trình biên dịch báo lỗi "Type parameter T is declared as 'in' but occurs in 'out' position in type T"
Có thể sử dụng bằng cách như thế này:
abstract fun nextT(input: T)
==================
Tóm lại:
"When we want to assign the generic type to any of its super type, then we need to use “out” keyword, and when we want to assign the generic type to any of its sub-type, then we need to use “in” keyword."
Nhận xét