繁体   English   中英

习惯性替代存在类型

[英]Idiomatic replacement for existential types

我有一些使用存在类型的Scala代码,我正在升级到2.10,我注意到有关添加“import language.existentials”的警告,这让我觉得应该有更好的方法来编写它。 我的代码归结为:

class A {
  private var values = Set.empty[(Class[_], String)]
  def add(klass: Class[_], id: String) {
    val key = (klass, id)
    if (!values(key)) {
      values += key
      // More logic below..
    }
  }

我收到这个警告:

[warn] test.scala:4 inferred existential type (Class[_$2], String) forSome { type _$2 }, which cannot be expressed by wildcards, should be enabled
[warn] by making the implicit value language.existentials visible.
[warn] This can be achieved by adding the import clause 'import language.existentials'
[warn] or by setting the compiler option -language:existentials.
[warn] See the Scala docs for value scala.language.existentials for a discussion
[warn] why the feature should be explicitly enabled.
[warn]       val key = (klass, id)

有没有办法可以重写我的代码而不是生成这个警告(或者需要导入),还是那种表达它的最惯用的方法呢? 我从不在代码中的任何地方询问类的类型参数。

警告是关于存在类型的推论,这通常是不可取的。 添加import语句,或将其显式化:

val key: (Class[_], String) = (klass, id)

如果为add方法提供类型参数,则警告消失。 这不会影响可以存储在var值中的内容。 我没有一个很好的答案,但它是一个解决方法。 希望更有能力的人也会回复解释。

  class A {
    private var values = Set.empty[(Class[_], String)]

    def add[T](klass: Class[T], id: String) {
      val key = (klass, id)
      if (!values(key)) {
        values += key
        // More logic below..
      }
    }
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM