【发布时间】:2010-11-14 04:37:08
【问题描述】:
假设我有两个类,Input 和 Output,它们被设计为相互连接。 Output 产生某种类型的值,Input 消费它们。
class Input[T] {
var output: Option[Output[_ <: T]] = None
}
class Output[T] {
var input: Option[Input[_ >: T]] = None
}
只要Input 类型参数是Output 类型参数的超类型,如果Input 和Output 对不在同一类型的值上操作,也可以。请注意,两个类中的类型参数是不变的;在实际版本中,它同时用于协变和逆变位置。
我在别处有一个connect 方法,它在Input/Output 对之间建立了一个链接:
def connect[T](output: Output[T], input: Input[_ >: T]) = {
output.input = Some(input)
input.output = Some(output)
}
如果我像下面这样调用这个方法,我会得到一个类型错误:
val out = new Output[String]
val in = new Input[AnyRef]
connect(out, in)
错误是:
test.scala:17: error: type mismatch;
found : Output[String]
required: Output[AnyRef]
connect(out, in)
^
我可以通过写出类型参数来解决这个问题(在这种情况下,我会写connect[String],但我认为编译器应该能够为我解决这个问题。我该如何更改connect 方法所以类型参数是自动推断的?
编辑:目前,我已经将connect 设为Output 的方法,因此它会自动获取类型参数。这还有一个额外的好处,我可以使用中缀符号out connect in,但是设计感觉有点别扭。
我仍然对编译器为何表现出这种行为感兴趣。我觉得它应该能够推断出类型参数。这真的按规定工作吗?
【问题讨论】:
-
你的意思是“不要在上操作同一种值”
-
你试过向 Scala 邮件列表提问吗?
标签: generics scala types type-inference