2017-02-23 7 views
0

私はスカラーにとって比較的新しいので、愚かな質問をしたら私に気をつけてください。 メソッドランタイムを呼び出す必要があるという要件があります。実行時に特性を拡張するスカラクラスを呼び出す

私はこの2つのクラスによって拡張された二つのクラス

trait Animal { 
    def walk():DataFrame 
} 

によって拡張されている形質を持っています。

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

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

今のconfigファイルから私は

が、私はこれらのクラスを呼び出すと散歩メソッドを実行する必要があり、この

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

あり、いくつかの問題がある、のは、それらを一つずつみましょう:そう、

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

forEach方法は、実際にforeachです:

あなたがする必要があるScalaでリストを作成するには小さなタイプミスがあります。最後に、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を使用していましたが、今はJavaリストがforEachを使用するScalaListに変換され、ScalaListはforeachを使用します。これらの詳細についてはありがとうございます – user2166328

関連する問題