2017-01-14 8 views
0

isInstanceOfは値型を見つけるのに使うことができますが、どのように 'str'の型を見つけるのですか?Scalaで値型のインスタンスを見つけるには?

どのようなタイプですか?

scala> val str = ("Scala", "Elixir","Spark") 
str: (String, String, String) = (Scala, Elixir, Spark) 

次は、エラー(今のところどれ/ AnyRefなどを除外)スロー:

scala> str.isInstanceOf[List] 
<console>:13: error: type List takes type parameters 
     str.isInstanceOf[List] 

scala> str.isInstanceOf[String] 
<console>:13: warning: fruitless type test: a value of type (String, String, String) cannot also be a String (the underlying of String) 
     str.isInstanceOf[String] 
        ^
res9: Boolean = false 

を、私はそれをこのように確認することができますが、これの名前はありますか?

scala> str.isInstanceOf[(String, String, String)] 
res12: Boolean = true 

答えて

1

ScalaのREPLで使用:typeタイプ

実際の型はTuple3[String, String, String]

str.isInstanceOf[Tuple3[String, String, String]] 

ScalaのREPL

scala> val str = ("Scala", "Elixir","Spark") 
str: (String, String, String) = (Scala,Elixir,Spark) 

scala> :type str 
(String, String, String) 

scala> str.isInstanceOf[Tuple3[String, String, String]] 
res2: Boolean = true 

scala> str.getClass 
res3: Class[_ <: (String, String, String)] = class scala.Tuple3 
+0

Aha。ありがとう。私は22の最大サイズはここに当てはまると思いますか? – Bala

+0

REPLではなく、プログラムで ':type'を使うことができますか? – Bala

+0

@Balaプログラマチックに 'getClass' ...' scala> str.getClassを使用できます。 res3:クラス[_ <:(String、String、String)] =クラスscala.Tuple3' – pamu

1

で見つけますプログラムでvalの型を決定する方法

たとえば、値の型が特定の型であることを知りたいとしますか?

// assign x value 
val x: Any = "this is string" 

// custom function evaluate type 
def f[T](v: T) = v match { 
    case _: Int => println("Int") 
    case _: String => println("String") 
    case _   => println("Unknown") 
} 

// determine val type 
f(x) 
-1

(Scalaの2.10以降を意味する)現代、プログラム的に何かのコンパイル時の型を得るためのScalaの方法はTypeTagを使用しています。

scala> import scala.reflect.runtime.universe._ 
import scala.reflect.runtime.universe._ 

scala> def getType[T: TypeTag](value: T) = typeOf[T] 
getType: [T](value: T)(implicit evidence$1: reflect.runtime.universe.TypeTag[T])reflect.runtime.universe.Type 

scala> val str = ("Scala", "Elixir","Spark") 
str: (String, String, String) = (Scala,Elixir,Spark) 

scala> println(getType(str)) 
(java.lang.String, java.lang.String, java.lang.String) 

scala> getType(str) <:< typeOf[(String,String,String)] 
res1: Boolean = true 

scala> getType((1,2,3)) <:< typeOf[(String,String,String)] 
res2: Boolean = false 

getClassは、消去されたランタイムクラスを提供します。 isInstanceOf[T]は、消去された実行時クラスが、消去された実行時クラスTと同じかサブクラスかをテストします。

「消去済み」とは、次のことがtrueと評価されることを意味します。

(1,2,3).isInstanceOf[(String,String,String)] 

"ランタイム" と "コンパイル時" これはtrueであることを意味:使用しているプログラムでタイプを決定するために

val a: Any = (1,2,3) 
getType(a) <:< typeOf[(Int,Int,Int)] 
+1

このコードスニペットは、[説明を含む](// meta.stackexchange。com/questions/114762/explain-entire-code-based-answers)は本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。あなたのコードに説明的なコメントを詰め込まないようにしてください。これは、コードと説明の両方の可読性を低下させます! – Carpetsmoker

1

は、さらに別の方法:これはfalseている間

val a: Any = (1,2,3) 
a.isInstanceOf[(_,_,_)] 

マニフェスト:

scala> def getType[T: Manifest](t: T): Manifest[T] = manifest[T] 
getType: [T](t: T)(implicit evidence$1: Manifest[T])Manifest[T] 

scala> val str = ("Scala", "Elixir","Spark") 
str: (String, String, String) = (Scala,Elixir,Spark) 

scala> getType(str) 
res0: Manifest[(String, String, String)] = scala.Tuple3[java.lang.String, java.lang.String, java.lang.String] 
+0

私は、マニフェストは、TypeTagsとClassTagsのために非難されていると考えています。 –

関連する問題