จะตรวจสอบคลาส“ instanceof” ใน kotlin ได้อย่างไร?


95

ในชั้นเรียน Kotlin ฉันมีพารามิเตอร์วิธีการเป็นวัตถุ (ดู Kotlin doc ที่นี่ ) สำหรับประเภทระดับT ในฐานะวัตถุฉันกำลังส่งผ่านคลาสที่แตกต่างกันเมื่อฉันเรียกใช้เมธอด ใน Java เราสามารถเปรียบเทียบคลาสโดยใช้instanceofอ็อบเจ็กต์คลาสได้

เลยอยากตรวจสอบเปรียบเทียบที่ runtime ว่ามันคือ Class ไหน?

ฉันจะตรวจสอบinstanceofชั้นเรียนใน Kotlin ได้อย่างไร?

คำตอบ:




15

เราสามารถตรวจสอบได้ว่ามีการสอดวัตถุชนิดรับที่รันไทม์โดยใช้ผู้ประกอบการหรือรูปแบบของเมื่อตะกี้is!is

ตัวอย่าง:

if (obj is String) {
    print(obj.length)
}

if (obj !is String) {
    print("Not a String")
}

อีกตัวอย่างหนึ่งในกรณีของ Custom Object:

ขอให้ฉันมีประเภทobjCustomObject

if (obj is CustomObject) {
    print("obj is of type CustomObject")
}

if (obj !is CustomObject) {
    print("obj is not of type CustomObject")
}

4
หมายเหตุสิ่งที่ดีอีกคนหนึ่งที่นี่: ภายในบล็อกของif, ถูกโยนโดยอัตโนมัติobj Stringดังนั้นคุณสามารถใช้คุณสมบัติเช่นlengthโดยตรงโดยไม่จำเป็นที่จะต้องโยนอย่างชัดเจนobjที่จะStringอยู่ภายในบล็อก
Jesper


3

ลองใช้คีย์เวิร์ดที่เรียกว่าis Official page reference

if (obj is String) {
    // obj is a String
}
if (obj !is String) {
    // // obj is not a String
}

เป็นเรื่องดีมากที่จะให้คำตอบพร้อมเอกสารอย่างเป็นทางการ แต่เป็นแนวทางปฏิบัติที่ดีกว่าในการเพิ่มโค้ดตัวอย่างในคำตอบซึ่งจะมีประโยชน์หากลิงก์ไม่ทำงาน ขอบคุณสำหรับคำตอบ.
pRaNaY

ไม่แนะนำให้ใช้คำตอบที่เชื่อมโยงเท่านั้น
Jayson Minard

0

คุณสามารถตรวจสอบได้เช่นนี้

 private var mActivity : Activity? = null

แล้ว

 override fun onAttach(context: Context?) {
    super.onAttach(context)

    if (context is MainActivity){
        mActivity = context
    }

}

0

คุณสามารถอ่านเอกสาร Kotlin นี่https://kotlinlang.org/docs/reference/typecasts.html เราสามารถตรวจสอบว่าออบเจ็กต์เป็นไปตามประเภทที่กำหนดในรันไทม์หรือไม่โดยใช้ตัวisดำเนินการหรือรูปแบบที่!isเป็นลบตัวอย่างเช่นโดยใช้is:

fun <T> getResult(args: T): Int {
    if (args is String){ //check if argumen is String
        return args.toString().length
    }else if (args is Int){ //check if argumen is int
        return args.hashCode().times(5)
    }
    return 0
}

จากนั้นในฟังก์ชั่นหลักฉันพยายามพิมพ์และแสดงบนเทอร์มินัล:

fun main() {
    val stringResult = getResult("Kotlin")
    val intResult = getResult(100)

    // TODO 2
    println(stringResult)
    println(intResult)
}

นี่คือผลลัพธ์

6
500

-1

วิธีแก้ปัญหาอื่น ๆ : KOTLIN

val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container)

if (fragment?.tag == "MyFragment")
{}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.