2011-09-03 29 views
7

考慮以下代碼:爲什麼Manifest在構造函數中不可用?

class Foo[T : Manifest](val id: String = manifest[T].erasure.getName) 

我基本上要保存在富,這往往只是類名的標識符。

不需要特殊標識符的子類可以很容易地使用默認值。

但這並不甚至編譯,該錯誤信息是:

error: No Manifest available for T. 

有另一種辦法,將工作?

編輯:

爲什麼如果清單是不可用,直到主構造這項工作?

class Foo[T: Manifest](val name: String) { 
    def this() = this(manifest[T].erasure.getName) 
} 
+0

之前可用,但如果您使用'manifest [T]'而不是'隱式[Manife ST [T]]'。 –

回答

9

當語法糖是由這方面的約束去掉,它就會被改寫爲:

class Foo[T] 
    (val id: String = implicitly[Manifest[T]].erasure.getName) 
    (implicit ev$1: Manifest[T]) = ... 

所以確定id的默認值時,清單證據根本無法使用。我寫的,而不是像這樣:

class Foo[T : Manifest](id0: String = "") { 
    val id = if (id0 != "") id0 else manifest[T].erasure.getName 
} 

在你的第二個方法(這是一個很好的解決方案,順便!),希望重寫類似於:

class Foo[T](val name: String)(implicit x$1: Manifest[T]) { 
    def this()(implicit ev$2: Manifest[T]) = this(manifest[T].erasure.getName) 
} 

所以是的,清單在致電manifest[T].erasure

+0

但是不會創造一個多餘的領域? – soc

+0

爲了避免多餘的字段,從'id0'的定義中刪除'val'修飾符? –

+0

Mhhh ...我想我只是通過增加一個 – soc

相關問題