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

在Scala中键入提取

发布时间:2020-12-16 18:15:12 所属栏目:安全 来源:网络整理
导读:我是 Scala和高级编程语言的新手.我尝试解决以下问题. 我有: val s: Seq[SomeMutableType[_]] 我假设序列中的所有元素都是相同的类型(但此时不知道哪一个). 我怎么称呼: def proc[T](v0: SomeMutableType[T],v1: SomeMutableType[T]) { /* ... */ } 喜欢的
我是 Scala和高级编程语言的新手.我尝试解决以下问题.

我有:

val s: Seq[SomeMutableType[_]]

我假设序列中的所有元素都是相同的类型(但此时不知道哪一个).

我怎么称呼:

def proc[T](v0: SomeMutableType[T],v1: SomeMutableType[T]) { /* ... */ }

喜欢的东西

proc(s(0),s(1))

编译器抱怨:

  • type mismatch; found : SomeMutableType[_$351] where type _$351 required:
    SomeMutableType[Any] Note: _$351 <: Any,but class SomeMutableType is invariant in type T. You
    may wish to define T as +T instead. (SLS 4.5)

我想到了那个协变的东西,但我不相信它在我的情况下是有道理的.当我说s(0)和s(1)属于同一类型时,我只想让编译器相信我!我通常通过一些转换来做这个,但我不能在这里强制转换为SomeMutableType [T],因为T由于擦除而未知.当然,我无法改变proc的定义.

解决方法

问题是你真的无法做出这样的保证.例如:

scala> import scala.collection.mutable.Buffer
import scala.collection.mutable.Buffer

scala> val s: Seq[Buffer[_]] = Seq(Buffer(1),Buffer("a"))
s: Seq[scala.collection.mutable.Buffer[_]] = List(ArrayBuffer(1),ArrayBuffer(a))

看到?您不知道s(0)和s(1)属于同一类型,因为它们可能不是同一类型.

此时,您应该问一个关于您想要完成什么的问题,而不是询问如何解决您想要完成它的问题.他们采取的方式将无法正常工作.退一步,想想你试图用这种方法解决的问题,并询问如何解决这个问题.

例如,你说:

I assume that all elements in the sequence are of the same type (but do not know which
one at this point).

您可能想要做的是参数化类或方法,并在声明s时使用其类型参数.或者,也许,根本就没有.

(编辑:李大同)

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

    推荐文章
      热点阅读