목록은 모든 요소에 같은 유형이 있다고 가정하고이 같은 것을 할 수있는 일반 스칼라를 사용하여 :
def test(list: List[Any]): List[Any] = {
if(list.isEmpty) return List()
list.head match {
case a: String => list.map(str => str.asInstanceOf[String]+"3")
case a: Int => list.map(int => int.asInstanceOf[Int]+3)
}
}
그것은 최선의 해결책이 아니다,하지만 난 아무것도 다른 표시되지 않는 당신을
:
여기
당신이 목록의 모든 요소에 동일한 유형이 필요 물론 당신이 함수에 넣었습니다 정확히 동일한 유형을 반환 할 수 있습니다, 심지어 괴상 솔루션이며, 다른 라이브러리없이 사용할 수 있습니다
def test[T](list: List[T]): List[T] = {
if(list.isEmpty) return List()
list.head match {
case a: String => list.map(str => (str.asInstanceOf[String]+"3").asInstanceOf[T])
case a: Int => list.map(int => (int.asInstanceOf[Int]+3).asInstanceOf[T])
}
}
test(List("123","123")) // res0: List[String] = List(1233, 1233)
test(List(1,2,3)) // res1: List[Int] = List(4, 5, 6)
그리고 다시 편집, 마지막으로,이 같은 유형의 삭제를 방지하고 목록 유형을 확인 TypeTag를 사용할 수 있습니다
def test1[T: TypeTag](list: List[T]): List[T] = typeOf[T] match {
case t if t =:= typeOf[String] => list.map(str => (str.asInstanceOf[String]+"3").asInstanceOf[T])
case t if t =:= typeOf[Int] => list.map(int => (int.asInstanceOf[Int]+3).asInstanceOf[T])
case _ => list
}
test1(List("123", "123", "123")) // Strings so: res0: List[String] = List(1233, 1233, 1233)
test1(List("123","123", 1)) // Oh-oh we have not defined type, so: res1: List[Any] = List(123, 123, 1)
test1(List(1,2,3)) // And here we have res2: List[Int] = List(4, 5, 6)
코드를 게시를하면 무엇을 시도했다 사용을 표시합니다. 간단히 말하자면, 단순한 타입 템플릿을 사용하여 할 수 있으며, 더 강력한 것을 필요로한다면 '고양이'나 'Scalaz'로 모나드 적으로 할 수도 있습니다. – sebszyller
반사가 없으면 추악하고 느립니다. 유형 정보는 [ADT] (http://typelevel.org/blog/2014/11/10/why_is_adt_pattern_matching_allowed.html) 또는 [HLists] (https://github.com/milessabin)에서 캡처해야합니다. /shapeless/wiki/Feature-overview:-shapeless-2.0.0#polymorphic-function-values) – Reactormonk