2016-06-26 7 views
1

는 I 정의 다음 함수가 : scalaTypesFor 및 scalaTypeOpt 모두 와일드 파라미터와 TypeTag을 수득 할 것으로 예상된다,이 경우왜 scala가 2 함수에서 와일드 카드 유형을 유추 할 수 없습니까?

import org.apache.spark.sql.catalyst.{ScalaReflection} 

import ScalaReflection.universe 
import universe.TypeTag 

def scalaTypesFor(dataType: DataType): Set[TypeTag[_]] = ... 

def scalaTypeOpt: Option[TypeTag[_]] = ... 

val catalystType = ... 
scalaTypeOpt.map(v => Set(v)) 
     .getOrElse{ 
     val default = scalaTypesFor(catalystType) 
     default 
     } 

를들은 동일한 유형이어야한다. 그러나 컴파일러에서 다음 오류가 발생했습니다 :

Error:(29, 51) inferred type arguments [scala.collection.immutable.Set[_117] forSome { type _$2; type _117 >: org.apache.spark.sql.catalyst.ScalaReflection.universe.TypeTag[_$2] <: org.apache.spark.sql.catalyst.ScalaReflection.universe.TypeTag[_] }] do not conform to method getOrElse's type parameter bounds [B >: scala.collection.immutable.Set[org.apache.spark.sql.catalyst.ScalaReflection.universe.TypeTag[_$2]] forSome { type _$2 }] 
    val effective = scalaTypeOpt.map(v => Set(v)).getOrElse{ 
               ^

형식 유추에 문제가 있습니까?

답변

1

두 개의 알 수없는 유형이 _ 존재하며 호환 가능하다는 보장이 없다고 생각합니다. 스칼라의 불변 세트 (immutable set)는 부정확하게 불변합니다 (사람들이 논평을하기 전에 많은 논의가있었습니다. 그리고 이것에 대한 최종적인 단어는 실제로 공변 적이 지 않다는 진정한 근본적인 이유가 없습니다). 타이핑 문제도 있습니다.

주위 테스트하기 위해 컴파일러를하지 않습니다하지만 당신은 몇 가지

을 시도 할 수
  1. (가능성이 작동하는) 돌리다 코드는 컴파일러 수 있도록 Set[TypeTag[_]](v)
  2. 변화에 따라 세트의 종류 당신이 일을 할 수있는 경우

    def scalaTypesFor[T](dataType: DataType): Set[TypeTag[T]] = ??? 
    
    def scalaTypeOpt[T]: Option[TypeTag[T]] = ??? 
    
    def xform[T] = { 
        val catalystType = ??? 
        scalaTypeOpt[T].map(v => Set(v)) 
         .getOrElse{ 
         val default = scalaTypesFor[T](catalystType) 
         default 
        } 
    } 
    

나 : 알 수없는 유형을 캡처하고이 같은 동일 하나 있다고 자신을 증명하기 위해 em 로컬 Defs

def xform[T] = { 
     def scalaTypesFor(dataType: DataType): Set[TypeTag[T]] = ??? 
     def scalaTypeOpt: Option[TypeTag[T]] = ??? 

     val catalystType = ??? 
     scalaTypeOpt.map(v => Set(v)) 
      .getOrElse{ 
      val default = scalaTypesFor(catalystType) 
      default 
     } 
    } 
+0

그 것이 당신의 문제를 해결합니까? – Creos