以下是一种类型安全、流畅的Scala构建器模式,如http://www.tikalk.com/java/blog/type-safe-builder-scala-using-type-constraints中所述。它与Scala和Java的构建器库类似,但专门处理编译时构建器检查。如何从Java调用它?是否可以通过"scala.Predef$$eq$colon$eq"参数为Scala和Java提供一个简洁的API?
sealed trait TBoolean
sealed trait TTrue extends TBoolean
sealed trait TFalse extends TBoolean
class Builder[HasProperty <: TBoolean] private(i: Int) {
protected def this() = this(-1)
def withProperty(i: Int)(implicit ev: HasProperty =:= TFalse) = new Builder[TTrue](i)
def build(implicit ev: HasProperty =:= TTrue) = println(i)
}
//javap output
public class Builder extends java.lang.Object implements scala.ScalaObject{
public Builder withProperty(int, scala.Predef$$eq$colon$eq); //How is this called from Java?
public void build(scala.Predef$$eq$colon$eq);
public Builder();
}
object Builder {
def apply() = new Builder[TFalse]
}
null
的桥接方法,正如ittayd建议的那样(http://www.tikalk.com/incubator/blog/creating-java-api-scala-using-bridge#comments),可以工作,但它肯定会牺牲类型安全性。这是因为`null`是矛盾的实例:`TFalse =:= TTrue`。 - Aaron Novstrup=:=
类(即null
是唯一的矛盾)。 - Aaron Novstrup