2017-02-23 30 views
0

我對scala相對來說比較新,所以如果我問了一些愚蠢的問題,請耐心等待。 我有一個需求,我需要調用方法運行時。調用運行期間擴展特質的scala類

我正在由兩個類

trait Animal { 
    def walk():DataFrame 
} 

這是通過兩個類擴展延伸的性狀。現在

class Dog(sparkSession: SparkSession) extends Animal { 
    def walk():DataFrame = { 
     ............. 
    } 
} 

class Cat(sparkSession: SparkSession) extends Animal { 
    def walk():DataFrame = { 
     ............. 
    } 
} 

從一個配置文件,我會得到這些類名的列表

比方說像這樣

val animals = ["com.xy.Dog","com.xy.Cat"] 

我需要調用這些類和執行方法走。 我可以做這樣的事嗎?

animals.forEach{ animalString => 
    val animalObject = Class.forName(animalString).newInstance().asInstanceOf(Animal) 
    animalObject.walk 
} 
+1

當你運行代碼時會發生什麼? –

+0

我收到編譯錯誤: 「T0不帶參數」。 – user2166328

回答

1

有幾個問題,讓我們逐一:

要建立Scala中的一個列表中,您需要做的:

val animals = List("com.xy.Dog", "com.xy.Cat") 

forEach方法實際上是foreach,所以有一個小錯字。最後,當你調用newInstance時,你應該先獲得適當的構造函數,否則它將使用默認構造函數。

animals.foreach { animalString => 
    val animalObject = Class.forName(animalString) 
    .getConstructor(classOf[DataFrame]) // Get the constructor for a DataFrame argument 
    .newInstance(dataframe)    // Pass the dataframe instance 
    .asInstanceOf[Animal] 
    animalObject.walk 
} 

我已經對代碼做了一些小的更改,以使其能夠正常工作。您可以運行應用程序查看輸出:

class Dog extends Animal { 
    def walk(): Unit = { println("I'm a dog.") } 
} 

class Cat extends Animal { 
    def walk(): Unit = { println("I'm a cat.") } 
} 

object AnimalTest extends App { 
    val animals = List("com.xy.Dog", "com.xy.Cat") 
    animals.foreach { animalString => 
    val animalObject = Class.forName(animalString) 
     .newInstance() 
     .asInstanceOf[Animal] 
    animalObject.walk 
    } 
} 

請注意,我已經去除了構造函數的參數在這裏輕鬆地構建實例。其餘的差不多。我希望這可以幫助你。

+0

這真棒。它對我來說非常合適。是的,這個列表是從一個配置中讀取的,是的,我之前使用JavaList,現在我轉換爲ScalaList,其中Java列表使用forEach和ScalaList使用foreach。非常感謝你提供這些細節 – user2166328