加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

泛型 – 为什么Scala不能在此示例中推断出类型参数?

发布时间:2020-12-16 08:54:29 所属栏目:安全 来源:网络整理
导读:假设我有两个类,输入和输出,它们被设计为相互连接.输出产生某种类型的值,Input使用它们. class Input[T] { var output: Option[Output[_ : T]] = None}class Output[T] { var input: Option[Input[_ : T]] = None} 只要输入类型参数是输出类型参数的超类型,
假设我有两个类,输入和输出,它们被设计为相互连接.输出产生某种类型的值,Input使用它们.

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

只要输入类型参数是输出类型参数的超类型,输入和输出对不会对相同类型的值进行操作也没关系.请注意,两个类中的type参数都是不变的;在实际版本中,它用于共同和逆变位置.

我在其他地方有一个连接方法,它在输入/输出对之间建立一个链接:

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方法以便类型参数是自动推断?

编辑:现在,我已经连接了一个Output方法,所以它自动获取type参数.这也有额外的好处,我可以使用中缀符号连接,但设计感觉有点尴尬.

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

解决方法

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

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

connect(out)(in)

……而且在这种情况下,确实有效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读