عملگر is

عملگر is در کاتلین به شما اجازه می‌دهد که تست کنید که آیا یک شیء یک نمونه از یک نوع خاص (کلاس، زیر کلاس، اینترفیس) است یا نه. عملگر is به دو عملوند نیاز دارد و یک مقدار بولی را برمی گرداند. به عنوان مثال، فرض کنید یک کلاس به نام Animel داریم، سپس یک نمونه از آن ایجاد می‌کنیم :

  1: class Animal
  2: 
  3: fun main(args: Array<String>)
  4: {
  5:     val myAnimal = Animal()
  6: 
  7:     if (myAnimal is Animal)
  8:     {
  9:         println("myAnimal is an Animal!")
 10:     }
 11: }
myAnimal is an Animal

رفتار عملگر is را در این مثال مشاهده کردید. همانطور که می‌بینید از آن به عنوان شرط در عبارت if استفاده شده است. کاربرد آن در مثال بالا این است که چک می‌کند که آیا شیء myAnimal یک نمونه از Animal است و چون نتیجه درست است کدهای داخل دستور if اجرا می‌شود. این عملگر همچنین می‌تواند چک کند که آیا یک شیء خاص در سلسله مراتب وراثت یک نوع خاص است. به این مثال توجه کنید :

  1: open class Animal
  2: 
  3: class Dog : Animal()
  4: 
  5: fun main(args: Array<String>)
  6: {
  7:     val myDog = Dog()
  8: 
  9:     if (myDog is Animal)
 10:     {
 11:         println("myDog is an Animal!")
 12:     }
 13: }
myDog is an Animal!

همانطور که در مثال بالا می‌بینید ما یک کلاس به نام Dog ایجاد کرده‌ایم که از کلاس Animal ارث می‌برد. سپس یک نمونه از این کلاس (Dog) ایجاد می‌کنیم و سپس با استفاده از عملگر is تست می‌کنیم که آیا نمونه ایجاد شده جز کلاس Animal است یا یک کلاس مشتق شده از کلاس Animal می‌باشد. از آنجاییکه کلاس Dog از کلاس Animal ارث می‌برد (سگ من یک حیوان است.)، نتیجه عبارت درست (true) است. حال جمله بالا را تغییر دهیم: ” حیوان من یک سگ است”. وقتی جمله برعکس می‌شود چه اتفاقی می افتد؟

val myAnimal = Animal()

if (myAnimal is Dog)
{
    println("myDog is an Animal!")
}

این باعث خطا نمی‌شود و عبارت فقط نتیجه false را بر می‌گرداند. می‌توان از کد بالا این را درک کرد که همه حیوانات سگ نیستند ولی همه سگها حیوان هستند.