How to parametrize class and implement method depends on type in Scala

前端 未结 1 419
暖寄归人
暖寄归人 2021-01-16 16:35

This is what I tried. Depends on what does user put into the function I want to add String or Double to new Chunk.

         


        
相关标签:
1条回答
  • 2021-01-16 16:37

    I have several comments:

    • check for NA outside the switch branch
    • you are missing non-NA case hence you are generating vector which is shorter than input vector (i expect you would like to generate the same length vector)

    Regarding generics, you need to provide type specialization. For example, something like the following snippet:

    class ReplaceNA[T](val value: T)(implicit add: TAdd[T]) extends MRTask[ReplaceNA[T]] {
      override def map(c: Chunk, nc: NewChunk): Unit = {
        for (row <- 0 until c.len()) {
          // Replace NAs by given value
          if (c.isNA(row)) {
            add.addValue(nc, value)
          } else {
            // Do something with default value
            nc.addNA()
          }
        }
      }
    
    }
    
    trait TAdd[T] extends Serializable {
      def addValue(nc: NewChunk, value: T)
    }
    
    object TAdd extends Serializable {
      implicit val addDouble = new TAdd[Double] { def addValue(nc: NewChunk, value: Double) = nc.addNum(value) }
      implicit val addFloat = new TAdd[Float] { def addValue(nc: NewChunk, value: Float) = nc.addNum(value) }
      implicit val addValueString = new TAdd[ValueString] { def addValue(nc: NewChunk, value: ValueString) = nc.addStr(value) }
    }
    
    0 讨论(0)
提交回复
热议问题