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

数组 – Scala中的Array [String]不是Seq [String]的子类?

发布时间:2020-12-16 19:00:49 所属栏目:安全 来源:网络整理
导读:我写了一个接受Seq [String]的所有子类的对象的方法.不幸的是它不会接受Array [String]类型的对象. Array [String]不是Seq [String]的子类? scala def test[T : Seq[String]](x: T) = {}test: [T : Seq[String]](x: T)Unitscala val data = "This is a test
我写了一个接受Seq [String]的所有子类的对象的方法.不幸的是它不会接受Array [String]类型的对象. Array [String]不是Seq [String]的子类?

scala> def test[T <: Seq[String]](x: T) = {}
test: [T <: Seq[String]](x: T)Unit

scala> val data = "This is a test string"
data: java.lang.String = This is a test string

scala> test(data.split(" "))
<console>:10: error: inferred type arguments [Array[java.lang.String]] do not conform to method test's type parameter bounds [T <: Seq[String]]
              test(data.split(" "))

解决方法

不,Array [String]转换为常规JVM数组,就像您在Java中看到的那样:String [].

您看到您在其他Scala Seq集合上看到的Array [String]上的所有操作的原因是从Array [T]到ArrayOps[T]有一个implicit conversion.

做这个:

def test[T <% Seq[String]](x: T) = {}

这被称为视图界限.这意味着T应该是Seq [String]的子类型,或者应该存在一个将T转换为Seq [String]的范围内的隐式转换.在幕后,编译器实际上添加了一个隐式参数进行测试,所以这个方法变成:

scala> def test[T <% Seq[String]](x: T) = {}
test: [T](x: T)(implicit evidence$1: T => Seq[String])Unit

这个隐含证据$1是现在作为在方法体内从T到Seq [String]的隐式转换的函数.

(编辑:李大同)

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

    推荐文章
      热点阅读