Hãy xem xét đoạn mã sau:Không thể suy ra contravariant loại Không có gì tham số
trait X[-T]
object Y extends X[Nothing]
def a[T](x: X[T]): X[T] = x
a(Y)
Compilation ở trên (2.12.3) không thành công với:
type mismatch;
found : Y.type
required: X[T]
a(Y)
^
này biên dịch tốt nếu:
- loại khác với
Nothing
được sử dụng (ví dụ:object Y extends X[String]
) - phương thức
a
không sử dụngT
trong loại trả về của nó (ví dụ:def a[T](x: X[T]): Unit = {}
) - tham số kiểu cho
a
được đưa ra một cách rõ ràng (ví dụ:a[Nothing](Y)
) T
được hiệp biến, không contravariant (cũng thất bại nếu nó bất biến)
Đây có phải là một số trường hợp đặc biệt trong trình biên dịch cho Nothing
?
Là một công việc xung quanh "thú vị", sau đây dường như làm việc tốt:
trait X[-T]
object Y extends X[Nothing]
def a[T, U <: T](x: X[T]): X[U] = x
a(Y)
Cảm ơn câu trả lời, nhưng tại sao sử dụng 'Chuỗi' thay vì 'Không có gì' làm cho ví dụ biên dịch? Hay tại sao công việc xung quanh? – adamw