Chuyển đến nội dung chính

Bài đăng

Hiển thị các bài đăng có nhãn kotlin

[Kotlin] Sử dụng in / Out đối với kiểu khai báo Generic

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

[Kotlin] Sử dụng Sealed Class

1. Tại sao phải dùng Sealed  class trong Kotlin? Hàm thực hiện 1 nhiệm vụ, nhưng tham số đầu vào có thể là các đối tượng khác nhau (Ví dụ hàm tihns khoảng cách, hàm tính tổng...). Với mỗi đối tượng đầu vào khác nhau, hàm thực hiện những cách tính khác nhau để ra kết quả cuôi cùng (khoảng cách, tổng...). Thông qua Sealed Class giúp việc khai báo hàm trở nên đơn giản hơn bằng cách gói gọn các đối tượng đầu vào bằng một Lớp khép kính (Sealed Class) 2. Ví dụ: sealed class Expr data class Const ( val number : Double ) : Expr ( ) data class Sum ( val e1 : Expr , val e2 : Expr ) : Expr ( ) object NotANumber : Expr ( ) fun eval ( expr : Expr ) : Double = when ( expr ) { is Const -> expr . number is Sum -> eval ( expr . e1 ) + eval ( expr . e2 ) NotANumber -> Double . NaN // the `else` clause is not required because we've covered all the cases } =>> Thông qua Sealed Class hàm eval(expr: Expr) có