gpt4 book ai didi

generics - 为什么 Scala 无法推断出本例中的类型参数?

转载 作者:行者123 更新时间:2023-12-02 22:14:49 29 4
gpt4 key购买 nike

假设我有两个类,InputOutput,它们被设计为相互连接。 Output 生成某种类型的值,Input 使用它们。

class Input[T] {
var output: Option[Output[_ <: T]] = None
}
class Output[T] {
var input: Option[Input[_ >: T]] = None
}

如果InputOutput对不对相同类型的值进行操作,只要Input类型参数是Output 类型参数的父类(super class)型。请注意,两个类中的类型参数都是不变的;在真实版本中,它用于协变和逆变位置。

我在其他地方有一个 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,但设计感觉有点尴尬。

我仍然对编译器为何表现出这种行为感兴趣。我觉得它应该能够推断类型参数。这实际上按照指定的方式工作吗?

最佳答案

如果使用多个参数列表,有时会得到更好的结果:

def connect[T](output: Output[T])(input: Input[_ >: T]) = {
output.input = Some(input)
input.output = Some(output)
}

connect(out)(in)

...确实在这种情况下,它有效。

关于generics - 为什么 Scala 无法推断出本例中的类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1185298/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com