2016-11-08 6 views
0

String/Arrayオブジェクトに対してfoldLeftメソッドを呼び出そうとしています。ような何か:スカラは文字列と配列の両方に一致します

def doSth(obj: Any): Int = { 
    obj match { 
    case t: TraversableOnce[Any] => t.foldLeft(0)((rs: Int, i: Any) => ...) 
    case other => ... 
    } 
} 

が、私はdoSth("abc")を呼び出すとき、それはcase otherと一致します。私が欲しいのはcase t: TraversableOnce[Any]です。

どうすればよいですか?

+0

もちろん、 'Array'は' TraversableOnce'でもなく、 'String'のように変換することができます。 –

答えて

4

Stringは、TraversableOnceのサブタイプではありません。そのため、TraversableOnceには一致しません。

Stringは、TraversableOnceのサブタイプであるStringOpsに暗黙的に変換できますが、チェックPredef.augmentString

このようにすることができます。この場合、スカラーコンパイラはStringを暗黙的にStringOpsに変換します。我々は"hello"

def doSth(obj: TraversableOnce[Any]): Int = { 
    println(obj.getClass()) 
    obj.foldLeft(0)((rs: Int, i: Any) => ...) 
} 

に、次のコードに渡す場合はclass scala.collection.immutable.StringOpsをプリントアウトします。 "hello"を渡すと、class java.lang.Stringが印刷されます。つまり暗黙の変換はありません。

def doSth(obj: Any): Int = { 
    obj match { 
    case t: TraversableOnce[Any] => t.foldLeft(0)((rs: Int, i: Any) => ...) 
    case other => 
     println(other.getClass) 
    } 
} 
+0

したがって、マッチ/ケースでは、scalaは暗黙的にStringOpsに変換しようとしませんか? –

+0

できます。 'case t:String => {val x:TraversableOnce [Any] = t; doSth(x) '} –

関連する問題