2013-06-13 33 views
3

我需要在伴侶對象中定義一個val,該伴隨對象使用將伴隨類作爲參數的方法進行初始化。Scala:在伴侶對象中獲得伴侶類

我想處理這與特點不要重複自己。我的問題是,X.getClass與classOf [X]不一樣。第一個是伴隨對象的類,第二個是伴隨類的類,但我需要直接獲取伴隨類而不對其進行硬編碼。

基本上,我需要這樣的:

trait Foo { 

} 

object FooCompanionObject[f <: Foo] { 
    val fClazz = classOf[f] 
} 

// Bar's fClass should be classOf[Bar] 
case class Bar extends Foo; 

object Bar extends FooCompanionObject[Bar]; 

的問題是,我不能讓這個類由於類型擦除

+0

爲什麼要向對象添加泛型類型聲明。沒有任何意義。 – cmbaxter

+0

我的對象將有一些方法返回f。 – maklemenz

回答

9

有在代碼中幾個問題的通用型的。首先,正如你已經說過的那樣,這個類型將被刪除,第二個object s(object FooCompanionObject[f <: Foo])不帶參數,第三個,object s不能被擴展(object Bar extends FooCompanionObject)。要做你想做的事情,你必須爲你的伴侶對象創建一個抽象基類,它需要一個類型參數,如果你願意,它可能會被限制爲一個特定的類型,並且必須在ClassTag上被上下文綁定。從ClassTag,你可以通過調用runtimeClass來獲得運行時類。最終的解決方案可能如下所示:

import scala.reflect.ClassTag 
import scala.reflect.classTag 

trait Foo 

abstract class Companion[A <: Foo : ClassTag] { 
    val fClazz = classTag[A].runtimeClass 
} 

class Bar extends Foo 
object Bar extends Companion[Bar] 


scala> Bar.fClazz 
res2: Class[_] = class Bar 
+0

不知道ClassTag。這解決了我的問題,謝謝 – maklemenz

+0

有沒有辦法獲得ClassOf [A]? (類型安全) –