런타임에 변수 유형을 얻고 싶습니다.
런타임에 변수 유형을 얻고 싶습니다. 어떻게해야합니까?
따라서 엄밀히 말하면 "변수 유형"은 항상 존재하며 유형 매개 변수로 전달 될 수 있습니다. 예를 들면 :
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]
.
또 다른 가능성은 당신이 할 것입니다 구체화 변수의 유형입니다. 즉, 당신이 그것을 저장할 수 있도록,이 반사를 포함 등, 주위를 통과, 당신은 사용이 될 것입니다, 값으로 유형을 변환 할입니다 ClassTag
나 TypeTag
. 예를 들면 :
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 : ClassTag
ClassTag
다음 과 같이 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
'Programing' 카테고리의 다른 글
vim에서 실행 된 명령이 bash 명령 별칭을 인식하지 못합니다. (0) | 2020.09.01 |
---|---|
Python Pandas를 사용하여 날짜 및 시간 열 결합 (0) | 2020.09.01 |
React redux에서 가져 오기 오류를 처리하는 가장 좋은 방법은 무엇입니까? (0) | 2020.09.01 |
dict처럼 작동하는 파이썬 클래스 (0) | 2020.09.01 |
레일 form_for 레이블에 대한 사용자 정의 텍스트 (0) | 2020.09.01 |