两个问题
Questions 1 带类型参数的类有什么用?
我能理解它的用处
trait SomeTrait[T]
我正在努力理解什么是类似的用例
class SomeClass[A](a:A) {...}
当我们将已知类型的参数传递给函数或类时,我们知道该参数允许哪些操作 . 所以,如果我有一个类如下,我知道因为参数是Int类型,我可以对参数'a'执行''
scala> class IntTest(a:Int) {
| def plusandPrintInt = {println(a+1)} //as 'a' is Int, we can do +
| }
defined class IntTest
scala> val i = new IntTest(1).plusandPrintInt
2
i: Unit = ()
但是当我创建一个接受类型参数[A]的类时,参数可以是任何类型 . 因此,我没有对传递的参数进行什么操作
scala> class TypeClass [A](a:A) {
| // what possibly can be done on A without knowing what A is?
| }
defined class TypeClass
特征是不同的,因为我们没有在特征中实现函数,而是让其他类这样做 . 当扩展接受Type参数的Trait时,通常通过指定实参数类型来扩展它 . 因此,我们可以调用参数的特定操作,因为我们知道参数的类型是什么
scala> trait TraitClass [T] {
| def whatever (t:T) // I am not bothered as I do not need to implement this function
| }
defined trait TraitClass
scala> class extendTraitClass extends TraitClass[Int] {
| def whatever(t:Int) {println(t+1)} //I know that t is Int so I can use +
| }
defined class extendTraitClass
scala> (new extendTraitClass).whatever(1)
2
似乎'a'可用的唯一操作如下
scala> def someFunction[A](a:A) {
| a. //double tabbed to get this list
!= + == ensuring formatted hashCode toString
## -> asInstanceOf equals getClass isInstanceOf ?
Question 2 类型类是否与类型特征相同?
2 回答
当您可以对type参数进行抽象时,多态类很有用 . 这意味着您的类所暴露的操作并不特定于某些具体类型 .
以非常常见的集合为例 . 例如,如果我们查看
List[A]
,是否应该为列表应该包含的每种类型创建List[A]
?当然不是,因为可以对任何类型执行基础操作 .Scala中另一个很好的例子是
Option[A]
. 如果您是实施者,是否要为每个可能存在的值创建一个选项?即:你不希望这样,因为没有理由 . 由于我们可以在任何类型参数
A
上进行抽象,因此可以使类或特征成为通用的,这样诸如map
之类的操作可以采用那些抽象类型的更高阶函数 .不确定你的意思是“相同” . 阶级和特征在性质上是不同的,具有不同的品质 .
Scala中的“Type class”意味着与“带有类型参数的类”不同的东西 . 这是一个特定的模式,在你对一般的类型参数感到满意之前你不应该关心它,所以我会认为你的问题2是
答案是类和特性之间当然存在差异(或者不会有两种不同的概念!),但这些差异是相同的,与class / trait是否具有类型参数无关 .
不,您可以在特征中实现方法 . 这是一个例子:
再说一次,没有:
在任何方面都没有问题 . 既不是