【问题标题】:Scala: How to avoid using the existential typeScala:如何避免使用存在类型
【发布时间】:2019-05-10 22:20:36
【问题描述】:

假设我有一个这样定义的特征

trait SomeTrait[A] {
  def doSomething(): Seq[A]
}

以及扩展此特征的多个类,如下所示。

class SomeClass extends SomeTrait[SomeType] {

  def doSomething(): Seq[SomeType] = {
    :
  }

}

现在在另一个类中,我想存储扩展特征的类的实例集合。

class AnotherClass {
 pirvate val someClassInstances = mutable.Buffer[SomeTrait[_]]()
 def addSomeClass[A](sc: SomeTrait[A]): Unit = {
   this.someClassInstances += sc
 }
}

如何避免在这里使用存在类型?

【问题讨论】:

  • 为什么要避免在这里使用存在类型?
  • 您可以将SomeTrait[A] 更改为SomeTrait[+A] 并改用Any
  • 我认为应该尽可能避免存在类型。我不确定在我的情况下是否可以避免它,这就是我在这里发帖的原因。
  • “我认为应该尽可能避免存在类型。”不。这是一个非常好的用途。
  • 这是一篇关于存在类型的好文章:typelevel.org/blog/2015/02/26/rawtypes.html

标签: scala existential-type


【解决方案1】:

以下是否满足您的需求:

import scala.collection.mutable

trait SomeTrait[A] {
  def doSomething(): Seq[A]
}

class SomeClass extends SomeTrait[Int] {
  def doSomething(): Seq[Int] = ???
}

class AnotherClass {
  private val someClassInstances = mutable.Buffer[SomeTrait[_]]()
  def addSomeClass(sc: SomeTrait[_]): Unit = {
    this.someClassInstances += sc
  }
}

?

【讨论】:

    猜你喜欢
    • 2020-10-28
    • 2017-01-18
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多