Scala:使用泛型类型参数声明方法

时间:2013-09-07 19:52:23

标签: scala generics

Scala中以下Java方法声明的等效内容是什么:

public <T>  T readValue(java.lang.String s, java.lang.Class<T> tClass)

换句话说,我想声明一个采用类型为T的类的方法,并返回该类型的实例。

2 个答案:

答案 0 :(得分:25)

  • 我。非常接近你想要的:

    def readValue[T:ClassTag](s:String):T = {
      val tClass = implicitly[ClassTag[T]].runtimeClass
      //implementation for different classes.
    }
    

    用法比Java更清晰:

    val myDouble = readValue[Double]("1.0")
    

答案 1 :(得分:2)

  • II。另一个更复杂的方法是将readValue的实现外部化到一些用户提供的对象(类型类):

    trait ValueReader[T] {
      def readValue(s: String): T
    }
    
    def readValue[T: ValueReader](s: String): T = {
      val reader = implicitly[ValueReader[T]]
      reader.readValue(s)
    }
    
    implicit val doubleReader = new ValueReader[Double] {
      def readValue(s:String) = // implementation for Double
    }