在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
答案 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"))))