Programing

런타임에 변수 유형을 얻고 싶습니다.

crosscheck 2020. 9. 1. 07:02
반응형

런타임에 변수 유형을 얻고 싶습니다.


런타임에 변수 유형을 얻고 싶습니다. 어떻게해야합니까?


따라서 엄밀히 말하면 "변수 유형"은 항상 존재하며 유형 매개 변수로 전달 될 수 있습니다. 예를 들면 :

val x = 5
def f[T](v: T) = v
f(x) // T is Int, the type of x

하지만 원하는 작업 에 따라 도움이되지 않습니다. 예를 들어, 변수의 유형이 무엇인지 모르고 의 유형 이 다음과 같은 특정 유형 인지 알고 싶을 수 있습니다 .

val x: Any = 5
def f[T](v: T) = v match {
  case _: Int    => "Int"
  case _: String => "String"
  case _         => "Unknown"
}
f(x)

여기서 변수의 유형이 무엇인지는 중요하지 않습니다 Any. 중요한 5것은 값 의 유형입니다 . 실제로 T는 쓸모가 없습니다 def f(v: Any). 대신 작성했을 수도 있습니다 . 또한 아래에 설명 된 ClassTag또는 값의를 사용 Class하며 유형의 유형 매개 변수를 확인할 수 없습니다. 무언가가 List[_]( List무언가) 인지 여부는 확인할 수 있지만 예를 들어 a List[Int]또는 인지 여부는 확인할 수 없습니다 List[String].

또 다른 가능성은 당신이 할 것입니다 구체화 변수의 유형입니다. 즉, 당신이 그것을 저장할 수 있도록,이 반사를 포함 등, 주위를 통과, 당신은 사용이 될 것입니다, 값으로 유형을 변환 할입니다 ClassTagTypeTag. 예를 들면 :

val x: Any = 5
import scala.reflect.ClassTag
def f[T](v: T)(implicit ev: ClassTag[T]) = ev.toString
f(x) // returns the string "Any"

A는 ClassTag또한 당신이 당신이받은 형 매개 변수를 사용하게됩니다 match. 작동하지 않습니다.

def f[A, B](a: A, b: B) = a match {
  case _: B => "A is a B"
  case _ => "A is not a B"
}

그러나 이것은 :

val x = 'c'
val y = 5
val z: Any = 5
import scala.reflect.ClassTag
def f[A, B: ClassTag](a: A, b: B) = a match {
  case _: B => "A is a B"
  case _ => "A is not a B"
}
f(x, y) // A (Char) is not a B (Int)
f(x, z) // A (Char) is a B (Any)

여기 에서는 이전 예제 의 암시 적 매개 변수처럼 작동 하지만 익명 변수를 사용하는 컨텍스트 경계 구문을 사용하고 있습니다.B : ClassTagClassTag

다음 과 같이 ClassTag값의 에서을 가져올 수도 있습니다 Class.

val x: Any = 5
val y = 5
import scala.reflect.ClassTag
def f(a: Any, b: Any) = {
  val B = ClassTag(b.getClass)
  ClassTag(a.getClass) match {
    case B => "a is the same class as b"
    case _ => "a is not the same class as b"
  }
}
f(x, y) == f(y, x) // true, a is the same class as b

A ClassTag는 유형 매개 변수가 아닌 기본 클래스 만 포함한다는 점에서 제한됩니다. ,이 즉 ClassTag위한 List[Int]List[String]동일하다 List. 유형 매개 변수가 필요한 경우 TypeTag대신 a 사용해야합니다 . TypeTag그러나 A 는 JVM 삭제 로 인해 값에서 얻을 수 없으며 패턴 일치에 사용할 수 없습니다 .

Examples with TypeTag can get quite complex -- not even comparing two type tags is not exactly simple, as can be seen below:

import scala.reflect.runtime.universe.TypeTag
def f[A, B](a: A, b: B)(implicit evA: TypeTag[A], evB: TypeTag[B]) = evA == evB
type X = Int
val x: X = 5
val y = 5
f(x, y) // false, X is not the same type as Int

Of course, there are ways to make that comparison return true, but it would require a few book chapters to really cover TypeTag, so I'll stop here.

Finally, maybe you don't care about the type of the variable at all. Maybe you just want to know what is the class of a value, in which case the answer is rather simple:

val x = 5
x.getClass // int -- technically, an Int cannot be a class, but Scala fakes it

It would be better, however, to be more specific about what you want to accomplish, so that the answer can be more to the point.


I think the question is incomplete. if you meant that you wish to get the type information of some typeclass then below:

If you wish to print as you have specified then:

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

scala> val x = List(1,2,3)
x: List[Int] = List(1, 2, 3)

scala> println(manOf(x))
scala.collection.immutable.List[Int]

If you are in repl mode then

scala> :type List(1,2,3)
List[Int]

Or if you just wish to know what the class type then as @monkjack explains "string".getClass might solve the purpose


If by the type of a variable you mean the runtime class of the object that the variable points to, then you can get this through the class reference that all objects have.

val name = "sam";
name: java.lang.String = sam
name.getClass
res0: java.lang.Class[_] = class java.lang.String

If you however mean the type that the variable was declared as, then you cannot get that. Eg, if you say

val name: Object = "sam"

then you will still get a String back from the above code.


i have tested that and it worked

val x = 9
def printType[T](x:T) :Unit = {println(x.getClass.toString())}

참고URL : https://stackoverflow.com/questions/19386964/i-want-to-get-the-type-of-a-variable-at-runtime

반응형