2013-01-25 18 views
1

我正在寫一個斯卡拉包裝過一些Java代碼與像method(cl: Class[_], name: String)方法簽名,在代碼中的許多方法的getClass看起來並不好:怎樣的getclass隱含

Creator.create(getClass, "One") 
Creator.create(getClass, "Two") 
Creator.create(getClass, "Three") 
Creator.create(getClass, "Four") 

所以我們可以某種方式得到封閉類隱象Creator.create("some name")

+0

你能更好地解釋你的問題?我強烈建議你避免使用反射.... – Edmondo1984

+0

@ Edmondo1984我對簡單的解決方案感興趣,如何隱式獲取類,並寫入方法(「some name」)而不是方法(getClass,「some name」),以及類方法[SomeClass](「some name」)的解決方案看起來不像一個更好的方法=) – 4lex1v

回答

2

答案1.

總的來說,我熱情地勸阻反射。但是,如果你真的想這樣做,在斯卡拉2.9.1,您可以使用清單

def create[T:Manifest](name:String) = { 
    val klass:Class[_] = t.erasure 
} 

在斯卡拉2.10,你應該看看到TypeTag。

回答2.

然而,正如我已經說過,正確的方法不會使用類,但隱含的建設者

trait Builder[T]{ 
    def build(name:String):T 
} 

def create[T](name:String)(implicit builder:Builder[T]) = { 
     builder.build(name) 
} 

以這種方式,你可以限制你可以創造什麼僅導入範圍的權利implicits,你就不會依靠反射,你不會冒險讓可怕RuntimeExceptions

發表評論答案

如果你的一點是要避免調用的getClass在每次調用時,你可以做以下

def create(name:String)(implicit klass:Class[_]) { 

} 

你可以這樣調用它

implicit val klass1 = myInstance.getClass 
create("hello") 
create("goodbye") 
+0

是的,我也想過ClassTags,但在這種情況下,因爲你已經傷心,我必須使用反射和重複方法[Classname](param)並不好,那麼只需調用方法(getClass,param) – 4lex1v