Theo " Hệ thống kiểu Scala ",
val c = new C
val clazz = c.getClass // method from java.lang.Object
val clazz2 = classOf[C] // Scala method: classOf[C] ~ C.class
val methods = clazz.getMethods // method from java.lang.Class<T>
Các classOf[T]
phương thức trả về các đại diện thời gian chạy cho một loại Scala. Nó tương tự như biểu thức Java T.class
.
Sử dụng classOf[T]
là thuận tiện khi bạn có một loại mà bạn muốn thông tin, trong khi getClass
thuận tiện để lấy thông tin tương tự từ một thể hiện của loại.
Tuy nhiên, classOf[T]
và getClass
trả về các giá trị hơi khác nhau, phản ánh hiệu ứng xóa kiểu trên JVM, trong trường hợp getClass.
scala> classOf[C]
res0: java.lang.Class[C] = class C
scala> c.getClass
res1: java.lang.Class[_] = class C
Đó là lý do tại sao những điều sau đây sẽ không hoạt động :
val xClass: Class[X] = new X().getClass //it returns Class[_], nor Class[X]
val integerClass: Class[Integer] = new Integer(5).getClass //similar error
Có một vé liên quan đến loại trả lạigetClass
.
( James Moore báo cáo rằng vé là "ngay bây giờ", tức là tháng 11 năm 2011, hai năm sau, đã được sửa.
Trong 2.9.1, getClass
hiện tại:
scala> "foo".getClass
res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String
)
Trở lại năm 2009:
Sẽ rất hữu ích nếu Scala coi việc trả về từ getClass () là java.lang.Class [T] forSome {val T: C} trong đó C là một dạng giống như xóa biểu thức tĩnh của biểu thức mà getClass là gọi là
Nó sẽ cho phép tôi làm một cái gì đó như sau đây khi tôi muốn hướng nội vào một lớp nhưng không cần một thể hiện của lớp.
Tôi cũng muốn giới hạn các loại lớp tôi muốn hướng nội, vì vậy tôi sử dụng Lớp [_ <: Foo]. Nhưng điều này ngăn tôi vượt qua trong một lớp Foo bằng cách sử dụng Foo.getClass () mà không cần diễn viên.
Lưu ý: liên quan getClass
, một cách giải quyết có thể sẽ là:
class NiceObject[T <: AnyRef](x : T) {
def niceClass : Class[_ <: T] = x.getClass.asInstanceOf[Class[T]]
}
implicit def toNiceObject[T <: AnyRef](x : T) = new NiceObject(x)
scala> "Hello world".niceClass
res11: java.lang.Class[_ <: java.lang.String] = class java.lang.String