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

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

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

  1. def typeGetterFun(`type`: DataType) = `type` match {
  2. case StringType => String
  3. case LongType => Long
  4. case IntegerType => Int
  5. }

错误:

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

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

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

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

2jcobegt

2jcobegt1#

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

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

TypeTag

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

Class

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

ClassTag

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

或类型类

  1. trait TypeGetter[T] {
  2. type Out
  3. }
  4. object TypeGetter {
  5. type Aux[T, Out0] = TypeGetter[T] { type Out = Out0 }
  6. implicit val string: Aux[StringType, String] = null
  7. implicit val decimal: Aux[DecimalType, BigDecimal] = null
  8. implicit val long: Aux[LongType, Long] = null
  9. implicit val integer: Aux[IntegerType, Int] = null
  10. }
  11. def foo[T](implicit typeGetter: TypeGetter[T]): typeGetter.Out = ???
展开查看全部

相关问题