下面是在Scala中的類型安全,流暢的構建器模式,如http://www.tikalk.com/java/blog/type-safe-builder-scala-using-type-constraints所述。它與Builder Library for Scala and Java類似,但專門處理編譯時生成器檢查。這怎麼能從Java中調用?給定「scala.Predef $$ eq $ colon $ eq」參數,可以使用Scala的乾淨API 和 Java來完成嗎?適用於Scala和Java的類型安全的Builder庫
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]
}
是,在Java相當嘈雜,但回答了這個問題。可能會犧牲Java版本中的類型安全......但是可能@Bridge用於提供純Java版本並刪除* assigned()參數? – eptx 2011-06-15 19:08:31
使用通過'null'的橋接方法,就像ittayd建議的一樣(http://www.tikalk.com/incubator/blog/creating-java-api-scala-using-bridge#comments)可以工作,但它肯定犧牲型號安全。這是因爲'null'是矛盾的一個實例:'TFalse =:= TTrue'。 – 2011-06-15 21:21:10
我還應該指出,這個構建器模式的類型安全性並不依賴於隱式搜索。相反,它依賴於不可能用兩個不相等的類型參數實例化'=:='類(即'null'是唯一的矛盾)。 – 2011-06-15 21:42:05