我知道 trait Foo[T]
意味着 T
是参数化类型。
但有时我可以看到trait Foo[T1,T2]
, 或 trait Foo[T1,T2,R]
,我找不到任何地方描述类型括号内多种类型的含义,你能指出我在这种情况下的用法吗?据我推测, Foo[T1,T2] 只是意味着,它定义了两个类型参数,不一定非要取 T1
并返回 T2
.
当我阅读 playframework今天的文档,我再次发现自己对这个问题感到困惑。在文档中,它说:
A BodyParser[A] is basically an Iteratee[Array[Byte],A], meaning that it receives chunks of bytes (as long as the web browser uploads some data) and computes a value of type A as result.
这个解释听起来像,类型括号内的第二个类型参数是返回类型。
我还记得
trait Function2 [-T1, -T2, +R] extends AnyRef
表示采用 T1
的函数和 T2
, 返回 R
.为什么他们将返回类型放在括号中?这是否意味着括号中的所有最后一个参数都是返回类型?或者他们只是碰巧为返回类型定义了一个新类型 R?
最佳答案
From what I speculate, Foo[T1,T2] just means, it defined two type parameters, it doesn't have to be take a
T1
and return aT2
.
类型参数的意思无非是“我需要任何类型,但我不想知 Prop 体类型是什么”,其中“我”是编写代码的程序员。类型参数可以像任何其他类型(例如 Int、String 或 Complex)一样使用 - 唯一的区别是在使用它们之前它们是未知的。
见类型
Map[A, +B]
.当您第一次阅读本文时,您无法知道 A 和 B 的用途,因此您必须阅读文档:A map from keys of type A to values of type B.
它解释了类型及其含义。没有什么需要知道或理解的了。它们只是两种类型。可以像
Map[Key, Value]
一样调用 Map但是在源代码中,类型参数最好只有一两个字母。这使得更容易区分类型参数和具体类型。它是指定类型参数含义的文档。如果没有文档,您必须查看来源并自己找到它们的含义。例如,您必须使用
Function2 [-T1, -T2, +R]
执行此操作.文档只告诉我们这一点:A function of 2 parameters.
好的,我们知道三个类型参数中的两个是函数期望的参数,但是第三个是什么?我们来看看来源:
def apply(v1: T1, v2: T2): R
啊,现在我们知道
T1
和 T2
是参数,R 是返回类型。类型参数也可以在 map 等方法签名中找到:
class List[+A] {
..
def map[B](f: (A) ⇒ B): List[B]
}
这就是将 map 与列表一起使用时的样子。 A
可以是任何类型 - 它是列表包含的元素的类型。 B
是另一种任意类型。当您知道 map 的作用时,您就会知道 B
做。否则你必须先了解 map 。 map 需要一个可以将 List 的每个元素转换为另一个元素的函数。因为你知道A
代表列表的元素,你可以从自己那里得到B
必须是类型 A
转化为。回答您的所有其他问题:这不应在一个答案中完成。 StackOverflow 上还有很多其他问题和答案,它们也可以回答您的问题。
概括
例如,当您在
Foo[T1, T2]
中看到某些类型参数时你不应该开始哭泣。想一想:“好吧,我有一个 Foo,它需要一个 T1 和一个 T2,如果我想知道他们做什么,我必须阅读文档或来源。”
关于Scala 类型参数括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5354803/