假設我有一個基類性狀和抽象類型
abstract class Base {
type B<: Base
def rep:String
def copy:B
}
class MyBase(override val rep:String) extends Base {
type B = MyBase
override def copy = new MyBase(rep)
}
然後我嘗試添加另一種特質的混入,爲此,我要返回類型的副本是合適的類型(這意味着調用通過將B設置爲適當的類型,在mixin上覆制返回一個混合類型)。我一直無法得到這個編譯,甚至無法理解override關鍵字應該去的地方。
編輯:人有我精的例子
abstract class Base {
type B <: Base
def rep:String
def copy:B
}
class MyBase(val rep:String) extends Base {
type B = MyBase
def copy = new MyBase(rep)
}
trait DecBase extends Base {
abstract override def rep = "Rep: "+super.rep
}
我的問題是,我怎麼聲明合適的B型和複印方法DecBase,因此複製返回DecBase,而且,爲什麼贏了」這個編譯?
println(((new MyBase("ofer") with DecBase)).rep)
這是我在Java中實現的一些東西(使用遞歸泛型類型)。我確信可以在Scala中做更好的事情。
編輯
使用
trait DecBase extends Base {
override type B = DecBase
abstract override val rep= "Dec:"+super.rep
abstract override def copy = new MyBase(rep) with DecBase
}
我得到以下編譯器錯誤
error: overriding type B in class MyBase, which equals com.amadesa.scripts.MyBase;
type B in trait DecBase, which equals com.amadesa.scripts.DecBase has incompatible type
println(((new MyBase("ofer") with DecBase)).rep)
error: overriding type B in class MyBase, which equals com.amadesa.scripts.MyBase;
type B in trait DecBase, which equals com.amadesa.scripts.DecBase has incompatible type
abstract override def copy = new MyBase(rep) with DecBase
我已經完善了這個問題。 – user44242 2011-02-01 16:16:20
再次編輯,這次添加編譯器錯誤。對我來說重要的是複製方法的正確返回類型。 – user44242 2011-02-01 16:56:06
現在我無法正常工作。首先,您不能將B重寫爲DecBase,因爲DecBase不是MyBase的子類型。但修復後,我仍然收到錯誤。編譯器似乎不喜歡重寫類型B = MyBase,但也可能是別的。 – sblundy 2011-02-01 17:18:27