参数化类与不同类型的关系,Scala

时间:2016-10-08 14:06:09

标签: scala polymorphism

在Scala中, 参数化类与不同类型之间的关系是什么?

例如,

class A[T]

A[Int] (or A[String])A之间的关系是什么?

A[Int]A[String]之间的关系是什么?

我想知道,因为我想做像

这样的事情
case class A[T](v: T) { def print = println(v) }

def iter(s: Seq[A[???]]) = s.map(print) // What is the proper annotation of '???'

iter(Seq(A(1), A("Hello")) // 1 Hello 

2 个答案:

答案 0 :(得分:1)

  

A [Int]和A之间的关系是什么?

A是类* → *的类型构造函数,A[Int]是将类型(Int)应用于类型构造函数{{1}的可能结果之一}}

  

A [Int]和A [String]之间的关系是什么?

这两种类型之间的最小上限是A,它只能被实例化为A[_ >: String with Int],因为它是A[Any]和{{1}的唯一超类。 }。

  

' ???'

的正确注释是什么

在您的String示例中,或者您可以添加到Int的类型参数,该参数本身会被Any实例化。

答案 1 :(得分:1)

类型与Variance相关。 要回答您的问题,Java在Scala中的通配符是Existential types。所以你可以指定这样的东西:

  def iter(s: Seq[A[_]]) = s.map(_.print)

相当于:

  def iter(s: Seq[A[T] forSome {type T}]) = s.map(_.print)

您还可以指定如下边界:

  def iter(s: Seq[A[_ <: CharSequence]]) = s.map(_.print)

  println(iter(Seq(A[StringBuilder](new StringBuilder("Test")), A[String]("Hello"))))

[构造函数中指定的显式类型,以避免隐式转换为所需类型的CharSequence]。 请注意,以下内容无法编译:

  def iter(s: Seq[A[CharSequence]]) = s.map(_.print)

  println(iter(Seq(A[StringBuilder](new StringBuilder("Test")), A[String]("Hello"))))

这是类中的方差规范有用的地方:

case class A[+T](v: T) {
    def print = v
  }

  def iter(s: Seq[A[CharSequence]]) = s.map(_.print)

  println(iter(Seq(A[StringBuilder](new StringBuilder("Test")), A[String]("Hello"))))