繁体   English   中英

我为什么要使用类型T = <type> 而不是特征[T]?

[英]Why would I use type T = <type> instead of trait[T]?

这是我从《 Scala编程》 一章中获得的观察结果。

在Scala中,我经常看到抽象特征模式:

trait Abstract {
  type T
  def transform(x: T): T
  val initial: T
  var current: T
}

class Concrete extends Abstract {
  type T = String
  def transform(x: String) = x + x
  val initial = "hi"
  var current = initial
}

为什么我会选择抽象特征模式而不是参数化泛型?

trait Abstract[T] {
  def transform(x: T): T
  val initial: T
  var current: T
}

class Concrete extends Abstract[String]{
  def transform(x: String): x + x
  val initial: "hi"
  var current: initial
}

两种方法大致相同。 我们可能更喜欢类型成员的一个原因是,方法可以用依赖类型来编写,而不必是通用的:

def doSomethingWith(a: Abstract): a.T = ...

可以说比

def doSomethingWith[T](a: Abstract[T]): T = ...

至少随着签名变得更加复杂(特别是如果我们在进行类型级编程时,使用Abstract作为类型级函数)。

类型推断可能还会有一些含义。 我不知道scala类型推断的工作原理,但是据我所知,无法部分指定函数的类型:

def functionWeWantToCall[U, V, W](a: Abstract[U], b: Abstract[V], c: Abstract[W])
functionWeWantToCall[String, _, _](x, y, z) //won't compile

def functionWeWantToCall(a: Abstract, b: Abstract, c: Abstract)
functionWeWantToCall(x: Abstract{type T = String}, y, z) //works

所以这就是我有时发现自己使用类型成员方法的原因。

同样,当然,有些人(例如,来自ML背景的人)只是觉得类型成员方法更熟悉或更易读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM