2016-11-30 26 views
0

'適用'メソッドを理解しようとしています。渡された引数に応じてList、Array、Setのいずれかを返すクラスを作成したいと思います。コードはListとSetで動作しますが、Arrayでは動作しません。私は、あなたが新しいArray[A]をインスタンス化するClassTag[A]を必要とする問題にクラスから配列を返すことができません

class CollectionFactory [A](s:String){} 
    object CollectionFactory { 
     def apply[A](s: String): Traversable[A] = { 
      s match { 
       case "list" => { 
        List[A]() 
       } 
//this doesnt work. It seems using [A] is incorrect. How do I specify the type? 
     /* 
     case "array" => { 
     new Array[A](1) 
     } 
    */ 
      case _ => { 
      Set[A]()  } 
      } 
     } 
    } 

val c = CollectionFactory[Int]("list") 
c: Traversable[Int] = List() 

CollectionFactory[String]("list") 
res0: Traversable[String] = List() 

CollectionFactory[Boolean]("") 
res1: Traversable[Boolean] = Set() 

答えて

0

を理解することはできませんよ。これは、implicit ct: ClassTag[A]パラメータを追加することで簡単に修正できます。

object CollectionFactory { 
    def apply[A: reflect.ClassTag](s: String): Traversable[A] = { 
    s match { 
     case "list" => List[A]() 
     case "array" => new Array[A](1) 
     case _ => Set[A]() 
    } 
    } 
} 
+0

#1は問題ではありません:それは暗黙のうちに 'Traversable' – Dima

+0

@Dima良い点を_is_ WrappedArray'、'に変換されます。 –

関連する問題