这篇文章主要介绍“scala的抽象类型怎么定义”,在日常操作中,相信很多人在scala的抽象类型怎么定义问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”scala的抽象类型怎么定义”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名与空间、虚拟主机、营销软件、网站建设、罗江网站维护、网站推广。
特质和抽象类可以包含一个抽象类型成员,意味着实际类型可由具体实现来确定。例如:
trait Buffer { type T val element: T}
这里定义的抽象类型T
是用来描述成员element
的类型的。通过抽象类来扩展这个特质后,就可以添加一个类型上边界来让抽象类型T
变得更加具体。
abstract class SeqBuffer extends Buffer { type U type T <: Seq[U] def length = element.length}
注意这里是如何借助另外一个抽象类型U
来限定类型上边界的。通过声明类型T
只可以是Seq[U]
的子类(其中U是一个新的抽象类型),这个SeqBuffer
类就限定了缓冲区中存储的元素类型只能是序列。
含有抽象类型成员的特质或类(classes)经常和匿名类的初始化一起使用。为了能够阐明问题,下面看一段程序,它处理一个涉及整型列表的序列缓冲区。
abstract class IntSeqBuffer extends SeqBuffer { type U = Int}def newIntSeqBuf(elem1: Int, elem2: Int): IntSeqBuffer = new IntSeqBuffer { type T = List[U] val element = List(elem1, elem2) }val buf = newIntSeqBuf(7, 8)println("length = " + buf.length)println("content = " + buf.element)
这里的工厂方法newIntSeqBuf
使用了IntSeqBuf
的匿名类实现方式,其类型T
被设置成了List[Int]
。
把抽象类型成员转成类的类型参数或者反过来,也是可行的。如下面这个版本只用了类的类型参数来转换上面的代码:
abstract class Buffer[+T] {
val element: T
}
abstract class SeqBuffer[U, +T <: Seq[U]] extends Buffer[T] {
def length = element.length
}
def newIntSeqBuf(e1: Int, e2: Int): SeqBuffer[Int, Seq[Int]] =
new SeqBuffer[Int, List[Int]] {
val element = List(e1, e2)
}
val buf = newIntSeqBuf(7, 8)
println("length = " + buf.length)
println("content = " + buf.element)
需要注意的是为了隐藏从方法newIntSeqBuf
返回的对象的具体序列实现的类型,这里的型变标号(+T <: Seq[U]
)是必不可少的。此外要说明的是,有些情况下用类型参数替换抽象类型是行不通的。
到此,关于“scala的抽象类型怎么定义”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!