2017-10-09 20 views
10

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ụng T 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) 

Trả lời

1

tôi sẽ cố gắng giải thích các dòng mã của dòng

Dòng 1: trait X[-T] -> đặc điểm X là contravariant trong loại T. Vì vậy, bạn có thể thay thế bất kỳ biến loại X [T] với loại con của nó. Trong trường hợp các loại biến thể, Z [A] là kiểu con của Z [B] nếu B là kiểu con của A.

Dòng 2: object Y extends X[Nothing] -> đối tượng Y là loại X [Không có]. Xin lưu ý rằng Không có gì là loại phụ của tất cả các loại khác.

Dòng 3: def a[T](x: X[T]): X[T] = x -> xác định biểu thức lấy đối số thuộc loại X [T]. Vì đặc điểm X là biến thể trong loại T, bạn cũng có thể truyền các kiểu con của X [T] tức là X [N] sao cho T là kiểu con của N

Dòng 4: a(Y) -> Biểu thức cuộc gọi 'a' với đối số kiểu X [Không có gì]. Vì trình biên dịch không biết kiểu đối số của 'a', nó không thể quyết định nếu X [Nothing] là kiểu con của X [T]. Có nhiều cách để giải quyết điều này

Solution 1: `a[Nothing]` -> explicitly defining the type 

Solution 2: `tait X[+T]` -> make X covariant in type T. In this case Z[A] is subtype of Z[B] if A is subtype of B. This will work because Nothing is subtype of any other type 
+0

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

Các vấn đề liên quan