Một ví dụ dựa trên kiến thức TypeTag thu được từ đọc Scala: What is a TypeTag and how do I use it? đăng bởi Eugene Burmako trong các ý kiến về câu hỏi của bạn:
import scala.reflect.runtime.universe._
object ScalaApplication {
def main(args: Array[String]) {
printType(List(42))
printType(List("42"))
printType(List("42", 42))
}
def printType[T : TypeTag](t: T) {
println(typeOf[T])
}
}
Điều này sẽ cho kết quả:
$ scala ScalaApplication.scala
List[Int]
List[String]
List[Any]
[CẬP NHẬT 1:]
Tuy nhiên, nếu bạn muốn được nhận thức của các loại được gán cho một tài liệu tham khảo của loại Any
bạn có thể phải lựa chọn một số loại loại wrapper biết:
import scala.reflect.runtime.universe._
object ScalaApplication {
def main(args: Array[String]) {
val anyWrapper = new AnyWrapper
List(1,2,3).foreach { i =>
i match {
case 1 => anyWrapper.any = 42
case 2 => anyWrapper.any = "a string"
case 3 => anyWrapper.any = true
}
print(anyWrapper.any)
print(" has type ")
println(anyWrapper.typeOfAny)
}
}
class AnyWrapper {
private var _any: Any = null
private var _typeOfAny: Type = null
def any = _any
def typeOfAny = _typeOfAny
def any_=[T: TypeTag](a: T) = {
_typeOfAny = typeOf[T]
_any = a
}
}
}
Điều này sẽ cho kết quả:
$ scala ScalaApplication.scala
42 has type Int
a string has type String
true has type Boolean
Nhưng giải pháp này vẫn không bao gồm trường hợp loại tham chiếu không xác định tại thời gian biên dịch.
[UPDATE 2:]
Nếu loại được đúc một cách rõ ràng để tham khảo các loại Any
, bạn có thể phải liệt kê tất cả các loại có thể trong một tuyên bố trận đấu để thu hồi các loại:
import scala.reflect.runtime.universe._
object ScalaApplication {
def main(args: Array[String]) {
List(1,2,3).foreach { i =>
val any: Any = i match {
case 1 => 42.asInstanceOf[Any]
case 2 => "a string".asInstanceOf[Any]
case 3 => true.asInstanceOf[Any]
}
print(any)
print(" has type ")
println(matchType(any))
}
}
def matchType(any: Any) = {
any match {
case a: Int => typeOf[Int]
case a: String => typeOf[String]
case a: Boolean => typeOf[Boolean]
}
}
}
Điều này sẽ cho kết quả:
$ scala ScalaApplication.scala
42 has type Int
a string has type String
true has type Boolean
Nhưng giải pháp này đòi hỏi bạn phải biết (một nd danh sách) tất cả các loại có thể mà bạn có thể nhận được trong giá trị any
.
Nguồn
2012-09-18 13:07:47
Có thể bạn có thể tìm thấy giải pháp khả thi sau khi đọc [câu trả lời này] (http://stackoverflow.com/a/1094214/315306) – Raffaele
@Raffaele. Cảm ơn bạn đã tham khảo. Thật không may câu hỏi (và câu trả lời) đối phó với trường hợp khi các loại được cụ thể và được biết đến trong thời gian biên dịch. Tệp kê khai không còn được dùng nữa và TypeTags (thay thế tệp kê khai) yêu cầu thẻ bê tông. –
Sử dụng AbsTypeTag (trong RC1 được đổi tên thành WeakTypeTag). Thông tin thêm tại đây: http://stackoverflow.com/questions/12218641/scala-2-10-what-is-a-typetag-and-how-do-i-use-it –