Giả sử tôi có hai lớp, Input
và Output
, được thiết kế để kết nối với nhau. Output
tạo ra các giá trị của một số loại và Input
tiêu thụ chúng.Tại sao Scala không thể suy ra tham số kiểu trong ví dụ này?
class Input[T] {
var output: Option[Output[_ <: T]] = None
}
class Output[T] {
var input: Option[Input[_ >: T]] = None
}
Không sao đâu nếu một Input
và Output
cặp không hoạt động trên cùng một loại giá trị càng lâu càng kiểu tham số Input
là một siêu kiểu của tham số Output
loại. Lưu ý rằng tham số kiểu trong cả hai lớp là bất biến; trong các phiên bản thực, nó được sử dụng ở cả hai vị trí đồng và contravariant.
Tôi có một phương pháp connect
nơi khác mà thiết lập một mối liên hệ giữa một cặp Input
/Output
:
def connect[T](output: Output[T], input: Input[_ >: T]) = {
output.input = Some(input)
input.output = Some(output)
}
Nếu tôi gọi phương pháp này như sau, tôi nhận được một lỗi type:
val out = new Output[String]
val in = new Input[AnyRef]
connect(out, in)
Lỗi này là:
test.scala:17: error: type mismatch;
found : Output[String]
required: Output[AnyRef]
connect(out, in)
^
Tôi có thể giải quyết điều này bằng cách viết ra các tham số kiểu (trong trường hợp này, tôi sẽ viết connect[String]
, nhưng tôi nghĩ rằng trình biên dịch sẽ có thể tìm ra điều này cho tôi. Làm thế nào tôi có thể thay đổi phương thức connect
để tham số kiểu được suy ra tự động?
Edit: Còn bây giờ, tôi đã thực hiện connect
một phương pháp Output
vì vậy nó được tham số kiểu tự động. Điều này cũng có thêm lợi ích mà tôi có thể sử dụng các ký hiệu infix out connect in
, nhưng thiết kế cảm thấy một chút khó xử.
Tôi vẫn quan tâm đến lý do trình biên dịch thể hiện hành vi này. Tôi cảm thấy như nó sẽ có thể suy ra các tham số kiểu. Điều này có thực sự hoạt động như được chỉ định không?
bạn có nghĩa là "không hoạt động * trên * cùng một loại giá trị" –
bạn đã thử đặt câu hỏi vào danh sách gửi thư của Scala chưa? – GClaramunt