如何在Scala中查找值类型的实例?

如何在Scala中查找值类型的实例?,scala,Scala,我知道isInstanceOf可以用来查找值类型,但是如何查找'str'的类型呢 它是什么类型的 scala> val str = ("Scala", "Elixir","Spark") str: (String, String, String) = (Scala, Elixir, Spark) 下面抛出一个错误(暂时排除Any/AnyRef等): 在scala repl中使用:type查找类型 实际类型是Tuple3[String,String,String] str.isInstan

我知道
isInstanceOf
可以用来查找值类型,但是如何查找'str'的类型呢

它是什么类型的

scala> val str = ("Scala", "Elixir","Spark")
str: (String, String, String) = (Scala, Elixir, Spark)
下面抛出一个错误(暂时排除Any/AnyRef等):


在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
scala>val str=(“scala”、“长生不老药”、“火花”)
str:(弦,弦,弦)=(斯卡拉,长生不老药,火花)
scala>:类型str
(串,串,串)
scala>str.isInstanceOf[Tuple3[String,String,String]]
res2:Boolean=true
scala>str.getClass
res3:类[\u
如何以编程方式确定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)
现代(意味着Scala2.10或更高版本)Scala通过编程方式获取编译时类型的方法是使用

“运行时”和“编译时”表示这是正确的:

val a: Any = (1,2,3)
a.isInstanceOf[(_,_,_)]
虽然这是
false

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

getType(a)以编程方式确定类型的另一种方法是使用清单:

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]

此方法可以帮助您在运行时获取任何val/var的类型,它也可以在编译代码中使用

import scala.reflect.runtime.universe._

def printType[T](x: T)(implicit tag: TypeTag[T]): Unit = println(tag.tpe.toString)

printType(List[Int](1,2,3))  // output: List[Int]
printType(("xxx", 123, 0.1)) // output: (String, Int, Double)
printType(2)                 // output: Int

啊哈。谢谢。我想22的最大大小适用于这里?我怎样才能以编程方式使用
:type
而不是REPL?@Bala以编程方式使用
getClass
scala>str.getClass res3:Class[\u@Bala为什么需要通过编程确定类型?用例是什么?@maasg我没有特定的用例。只是在学习时出现的一个问题。我认为清单有点不赞成使用类型标记和类标记。虽然这个代码片段可以解决这个问题,但确实有助于提高帖子的质量。Re请记住,您将在将来为读者回答这个问题,而这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满您的代码,这会降低代码和解释的可读性!欢迎使用StackOverflow!
Recognizer。Recognizer(1)
返回
类Int
,因此我认为只有当
参数不为空时才应该返回
。您可以选择您的答案。@norbjd谢谢,我找到了一个更好的方法
val a: Any = (1,2,3)
a.isInstanceOf[(_,_,_)]
val a: Any = (1,2,3)
getType(a) <:< typeOf[(Int,Int,Int)]
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]
import scala.reflect.runtime.universe._

def printType[T](x: T)(implicit tag: TypeTag[T]): Unit = println(tag.tpe.toString)

printType(List[Int](1,2,3))  // output: List[Int]
printType(("xxx", 123, 0.1)) // output: (String, Int, Double)
printType(2)                 // output: Int