" দ্য স্কালাল টাইপ সিস্টেম " অনুসারে,
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>
classOf[T]
পদ্ধতি a Scala টাইপ জন্য রানটাইম উপস্থাপনা ফেরৎ। এটি জাভা অভিব্যক্তির সাথে সাদৃশ্যপূর্ণ T.class
।
ব্যবহার classOf[T]
, আপনি একটি টাইপ যে আপনার সম্পর্কে তথ্য চান আছে সুবিধাজনক সময় getClass
ধরনের একটি দৃষ্টান্ত থেকে একই তথ্য পুনরুদ্ধারের জন্য সুবিধাজনক।
যাইহোক, classOf[T]
এবং getClass
getClass ক্ষেত্রে JVM- তে মুছে ফেলা টাইপের প্রভাব প্রতিফলিত করে কিছুটা পৃথক মান ফেরান।
scala> classOf[C]
res0: java.lang.Class[C] = class C
scala> c.getClass
res1: java.lang.Class[_] = class C
এজন্য নিম্নলিখিতগুলি কাজ করবে না :
val xClass: Class[X] = new X().getClass //it returns Class[_], nor Class[X]
val integerClass: Class[Integer] = new Integer(5).getClass //similar error
রিটার্ন টাইপ সম্পর্কিতgetClass
একটি টিকিট আছে ।
( জেমস মুর জানিয়েছেন যে টিকিটটি "এখন", অর্থাৎ নভেম্বর থেকে ২০১১, দুই বছর পরে, স্থির
2..২.৯.১ এ getClass
এখন করেছে:
scala> "foo".getClass
res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String
)
২০০৯ এ ফিরে:
স্কেল যদি getClass () থেকে ফিরে আসা java.lang.Class [T] forSome {Val T: C treat হিসাবে আচরণ করে তবে এটি কার্যকর হবে যেখানে গ গ্লাসটি ক্লাসের মত প্রকাশের স্থির ধরণের ক্ষয়ের মতো like নামক
এটি আমাকে নীচের মতো কিছু করতে দেয় যেখানে আমি কোনও ক্লাসে আত্মপরিচয় করতে চাই তবে একটি শ্রেণির উদাহরণের প্রয়োজন হবে না।
আমি যে ধরণের ক্লাসের উপর অন্তর্মুখী করতে চাই সেগুলিও সীমাবদ্ধ রাখতে চাই, তাই আমি ক্লাসটি ব্যবহার করি [_ <: Foo]। তবে এটি আমাকে কাস্ট ছাড়াই Foo.getClass () ব্যবহার করে একটি ফু ক্লাসে যেতে বাধা দেয়।
দ্রষ্টব্য: সম্পর্কিত getClass
, সম্ভাব্য কাজটি হ'ল:
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