2016-03-04 82 views
1

我想創建一個類的列表,像這樣:如何創建類列表?

abstract class Animal { 
    def name = this.getClass.getName 
    def say: String 
} 
class Dog extends Animal { 
    def say = "Woof" 
} 
class Cat extends Animal { 
    def say = "Meow" 
} 
val animalClasses = List(Dog, Cat) 

這翻倒在最後一行,並顯示錯誤消息:

Zoo.scala:18: error: not found: value Dog 

注意,我可以創建的列表類的實例很容易與List(new Dog(), new Cat()),但這不是我想要的。

+1

作爲另一個的一個運行時表示答案建議,你可以做 'val animalClasses = List(classOf [Dog],classOf [Cat])' 但是你確定你想走那條路嗎?幾乎可以肯定,您的用例可以改進爲更好的設計,即使用類型成員和類型參數,而不是將類用作值。如何以及爲了什麼你打算使用這個列表? – slouc

+0

我的實際應用程序是[Pris.scala]中的策略列表(https://github.com/cabalamat/prisdil/blob/master/Pris.scala)。我創建了動物示例來說明問題。 –

+0

我沒想到你實際上正在做一些涉及動物的東西:)我的意思是,你會傳遞這些值嗎?他們參與什麼樣的邏輯?你可以使用一些類似枚舉的結構而不是實際的類嗎?你有沒有考慮過案例課?在我使用Scala兩年中使用classOf的唯一真實用例是我需要在每個日誌條目中手動包含類名。 – slouc

回答

3

你去那裏:

scala> List(classOf[Dog],classOf[Cat]) 
res1: List[Class[_ >: Cat with Dog <: Animal]] = List(class Dog, class Cat) 

作爲每this

預定義函數classOf [T]返回Scala的類類型T.

+0

這是有效的,但我不能創建我的一個類的實例,例如'val puss =新班級[Cat]'失敗。 –

+0

我會說這是一個不同的問題,你正在看[斯卡拉反射](http://docs.scala-lang.org/overviews/reflection/overview.html)。也就是說,這可能是矯枉過正的,我會考慮@slouc的建議。看着你的Pris文件,你可以將你的對象的類名與已知類的名稱進行匹配/匹配(它們都已經有一個'name'變量,所以你可以檢查它們)。你將不得不以不同的方式處理'DefAtEnd',因爲在構造中的參數(我認爲你無法用運行時方法)。 – Esardes