我想定义其具有返回类型是依赖于传递到方法和包围性状的类型参数的参数的类型的方法。 这是相当困难的话我的意思来形容,所以下面是一些片段来解释。
我有几个积木
// 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
}
}
A结合具有源和目标和存在两种:
- 完成:源和目标类型参数是相同的
- 不完整的:源和目标类型参数不同
...
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的类型系统知识。
Allthough我很想找到一个解决方案,我也想了解如何获得这样的解决方案自己的未来。 如果您对上述问题的解决方案,可能你还点我的一些消息,我可以用它来教育自己?