Apache Spark 如何在scala中将一个数据类型作为返回对象返回

hrysbysz  于 2022-12-23  发布在  Apache
关注(0)|答案(1)|浏览(135)

我想返回一个数据类型作为scala中函数的返回值。我尝试了下面的函数。

def typeGetterFun(`type`: DataType) = `type` match {
      case StringType => String
      case LongType => Long
      case IntegerType => Int
    }

错误:

error: object java.lang.String is not a value
             case StringType => String

我还尝试使用类型标记,但也不起作用

def typeGetter(`type`:DataType): Any = `type` match {
      case StringType => universe.TypeTag[String]
      case x:DecimalType => universe.TypeTag[java.math.BigDecimal]
      case LongType => universe.TypeTag[Long]
      case IntegerType => universe.TypeTag[Int]
    }

我们需要传递mirror和apply方法的另一个参数。
我不知道如何做到这一点。我想要一个通用的一样,我正在尝试以上。

2jcobegt

2jcobegt1#

很难猜出你将如何使用这个函数。
根据您的使用情形,您可以尝试Type

def typeGetter(`type`: DataType): universe.Type = `type` match {
  case StringType => universe.typeOf[String]
  case x: DecimalType => universe.typeOf[java.math.BigDecimal]
  case LongType => universe.typeOf[Long]
  case IntegerType => universe.typeOf[Int]
}

TypeTag

def typeGetter(`type`: DataType): universe.TypeTag[_] = `type` match {
  case StringType => universe.typeTag[String]
  case x: DecimalType => universe.typeTag[java.math.BigDecimal]
  case LongType => universe.typeTag[Long]
  case IntegerType => universe.typeTag[Int]
}

Class

def typeGetter(`type`: DataType): Class[_] = `type` match {
  case StringType => classOf[String]
  case x: DecimalType => classOf[java.math.BigDecimal]
  case LongType => classOf[Long]
  case IntegerType => classOf[Int]
}

ClassTag

def typeGetter(`type`: DataType): scala.reflect.ClassTag[_] = `type` match {
  case StringType => scala.reflect.classTag[String]
  case x: DecimalType => scala.reflect.classTag[java.math.BigDecimal]
  case LongType => scala.reflect.classTag[Long]
  case IntegerType => scala.reflect.classTag[Int]
}

或类型类

trait TypeGetter[T] {
  type Out
}
object TypeGetter {
  type Aux[T, Out0] = TypeGetter[T] { type Out = Out0 }
    
  implicit val string: Aux[StringType, String] = null
  implicit val decimal: Aux[DecimalType, BigDecimal] = null
  implicit val long: Aux[LongType, Long] = null
  implicit val integer: Aux[IntegerType, Int] = null
}
  
def foo[T](implicit typeGetter: TypeGetter[T]): typeGetter.Out = ???

相关问题