2016-11-30 1 views
0

'적용'방법을 이해하려고합니다. 전달 된 인수에 따라 List, Array 또는 Set 중 하나를 반환하는 클래스를 만들고 싶습니다. 이 코드는 List 및 Set에는 사용할 수 있지만 Array에는 사용할 수 없습니다. 나는이 문제클래스에서 배열을 반환 할 수 없습니다.

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

당신은 새로운 Array[A]를 인스턴스화하는 ClassTag[A] 필요를 이해할 수 없습니다입니다. 이는 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''로 변환 얻을 것이다. –

관련 문제