我想定义一个方法,它的返回类型取决于传递给该方法的参数类型和封闭特征的类型参数。很难用语言来描述我的意思,所以下面是一些片段来解释。
我有一些积木
// This is the target of a binding
trait BindableValue[T] {
def set(value: T): Unit
// this is the method I am strugling with
def bindTo[S](o: S) = ???
}
// This will dispatch events of type T
trait Observable[T]
// This represents a value of type T that will
// dispatch events if the value changes
trait ObservableValue[T] extends Observable[T] {
def value: T
}
// An Observable can be converted to an optional ObservableValue
object ObservableValue {
implicit def wrap[T](o:Observable[T]):ObservableValue[Option[T]] =
new ObservableValue[Option[T]] {
val value = None
}
}
绑定具有源和目标,并存在两种:
- Complete:源类型参数和目标类型参数相同
- 不完整:源和目标类型参数不同
...
trait Binding[S, T] {
def source: ObservableValue[S]
def target: BindableValue[T]
}
class CompleteBinding[T](
val source: ObservableValue[T],
val target: BindableValue[T]) extends Binding[T, T]
class IncompleteBinding[S, T](
val source: ObservableValue[S],
val target: BindableValue[T]) extends Binding[S, T]
我可以构造以下实例。
val bindable1 = new BindableValue[Int] { def set(value:Int) = {} }
val property1 = new ObservableValue[Int] { def value = 0 }
val property2 = new ObservableValue[String] { def value = "" }
val bindable2 = new BindableValue[Option[Int]] { def set(value:Option[Int]) = {} }
val event1 = new Observable[Int] {}
val event2 = new Observable[String] {}
现在我想像这样使用这些实例:
// 'a' should be of type CompleteBinding
val a = bindable1 bindTo property1
// 'b' should be of type IncompleteBinding
val b = bindable1 bindTo property2
// 'c' should be of type CompleteBinding
val c = bindable2 bindTo event1
// 'd' should be of type IncompleteBinding
val d = bindable2 bindTo event2
我不知道如何定义该方法bindTo
,以便它编译上述 4 行并为所有值提供正确的具体类型。我只是想念有关 Scala 类型系统的知识。
尽管我很想找到一个解决方案,但我也想了解自己将来如何找到这样的解决方案。如果您对上述问题有解决方案,您能否向我指出一些可以用来教育自己的资源?