2013-09-07 13 views
10

Scalaでは、次のJavaメソッド宣言のと同等であること:つまりスカラ:ジェネリック型パラメータを持つ宣言方法

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

、私はタイプTのクラスを取るメソッドを宣言したいと思いますその型のインスタンスを返します。あなたが望むものに非常に近い

答えて

24
  • I.:

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

    用法は、Javaよりも少し明確である:

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

パーフェクト、感謝Arseniy ...私はそう、明らかに4分であなたの答えを受け入れることができますそうするでしょう。 – Neil

+0

ようこそ。メソッドを実装して答えIIを見たとき、あなたはそれをより拡張性とモジュラーにすることができます。 –

+0

@Neil、 'ClassTag'はScalaでこれを行う慣習的な方法ですが、' Class'オブジェクトをJavaの場合と同様に直接渡すことができます: 'def readValue [T](s:String、cls:Class [ T]):T' - 定義、 'readValue(" 1.0 "、classOf [Double])' - 用法。これは慣用的ではありませんが、時には役立つこともあります。 –

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 
    } 
    
関連する問題