জাভা java.lang.Class <T> বস্তুর সমতুল্য ala


183

প্রশ্নটি একটি উদাহরণ দ্বারা সর্বোত্তমভাবে ব্যাখ্যা করা হয়েছে:

জাভাতে জেপিএ সত্ত্বা ম্যানেজারের জন্য, আমি নিম্নলিখিতগুলি করতে পারি (অ্যাকাউন্টটি আমার সত্তা শ্রেণি):

Account result = manager.find(Account.class, primaryKey);

স্কালায়, আমার নির্বোধ প্রচেষ্টা:

val result = manager.find(Account.class, primaryKey)

তবে আমি যখন Account.classস্কেলে ব্যবহার করার চেষ্টা করি তখন মনে হয় এটি পছন্দ হয় না। স্ক্যালায় অ্যাকাউন্ট ক্লাসের জন্য আমি java.lang.Class অবজেক্টটি কীভাবে নির্দিষ্ট করতে পারি?


ভনসি ইতিমধ্যে উত্তর সরবরাহ করেছে, তবে স্কেলা এবং ক্ষয় করার বিষয়ে আমার নিজের প্রশ্ন / উত্তরটি একবার দেখুন । আমি মনে করি এটি আপনি যা চেষ্টা করছেন তার চেয়ে ভিন্ন উপায়ে কাজ করার ধারণাগুলি আপনাকে সরবরাহ করতে পারে।
ড্যানিয়েল সি সোব্রাল

উত্তর:


264

" দ্য স্কালাল টাইপ সিস্টেম " অনুসারে,

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]এবং getClassgetClass ক্ষেত্রে 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

4
এফওয়াইআই, @ ভনসির উল্লিখিত টিকিটটি 22 / জুন / 11 তারিখে নির্দিষ্ট করে চিহ্নিত করা হয়েছিল। 2.9.1 সালে getClass এখন আছে: Scala> "foo বিন্যাস" .getClass res0: java.lang.Class [: _ <: java.lang.String] = বর্গ java.lang.String
জেমস মুর

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.