如果你的要求是为返回的上下文实例的类型的一些实例作为简单...即this
那么你可以做到这一点,
class A() {
def omg(s: String): this.type = new A()
}
如果的传承参与,
trait A {
type omgType
def omg(s: String): omgType
}
class B() extends A {
override type omgType = this.type
override def omg(s: String): omgType = new B()
}
class C() extends A {
override type omgType = this.type
override def omg(s: String): omgType = new C()
}
但是,如果你想要更多的普遍性,那么你可能需要阅读以下内容并应用它在那里,
最简单的方法是从magnet pattern
中获取灵感,这是在喷雾中大量使用的。
我们可以借助灵感来构建我们的定制解决方案,请记住它既不是pure magnet pattern
也不是path dependent type
的方法。它是一个混合的混合鸡尾酒。
因此...可以说你想让你的def process
能够支持Int
和String
类型的输入参数,并最终返回相应的结果。
您需要定义隐含的磁铁,这些类型,
trait ProcessMagnet {
type Input
type Result
def input: Input
def process: Result
}
object ProcessMagnetProvider {
implicit def stringToStringProcessMagnet(string: String): ProcessMagnet = new ProcessMagnet {
override type Input = String
override type Result = String
override def input: Input = string
// define this for your doing...
override def process: Result = input + "_omg"
}
//... add for all your inputs
implicit def intToIntProcessMagnet(int: Int): ProcessMagnet = new ProcessMagnet {
override type Input = Int
override type Result = Int
override def input: Input = int
// define this for your doing...
override def process: Result = input + 1
}
}
def process[T](t: T)(implicit pmConverter: T => ProcessMagnet): ProcessMagnet = pmConverter(t)
// now just import our implicit magnets...
import ProcessMagnetProvider._
val intResult: Int = process(5).process.asInstanceOf[Int]
val stringResult: String = process("omg").process.asInstanceOf[String]
尝试的[要么](HTTP:// www.scala-lang.org/api/2.12.0/scala/util/Either.html):'Type1,Type2]' –
type1和type2之间是否有任何关系? – mfirry
你可以阅读'磁铁图案'或'路径依赖类型' –