Android Studio - วิธีการเรียก getClass () ไม่ชัดเจน


130

ฉันใช้ Android Studio สำหรับแอปพลิเคชัน Android ของฉัน
รหัสของฉันทำงานและคอมไพล์
เมื่อเร็ว ๆ นี้ IDE แสดงข้อผิดพลาด (เส้นสีแดง) บน getClass ของรหัสต่อไปนี้:

fragment.getClass().getSimpleName()

แต่แอปพลิเคชันยังคงรวบรวมและทำงานอยู่
ข้อผิดพลาดคือ:

Ambiguous method call. Both
getClass () in Object and
getClass () in Object match.

ใครช่วยอธิบายหน่อยได้ไหมว่ามันเกี่ยวกับอะไร และทำไมโค้ดยังคงทำงานอยู่?


1
การทำสำเนาgetClass () ที่
JJD

ฉันได้รับข้อผิดพลาดเดียวกัน แต่ฉันยังสามารถรวบรวมและเรียกใช้แอปได้ดี
Jason Robinson

คำตอบ:


255

ฉันคิดว่ามันเป็นข้อบกพร่องใน Android Studio อย่างที่เราทราบกันดีว่า Android Studio ใช้แพลตฟอร์ม IntelliJ และฟังก์ชันที่มีอยู่ของ IntelliJ IDEA Community Edition

Google ได้พัฒนาโดยร่วมมือกับ JetBrains และมีรายงานบั๊กเดียวกันนี้เกิดขึ้นใน IntelliJ เช่นกัน ดูรายงานข้อผิดพลาด

เพียงการแก้ปัญหาที่จะแก้ไขปัญหานี้คือการโยนอินสแตนซ์ที่คุณโทรgetClass()ในการObjectดังต่อไปนี้:

((Object) this).getClass()

20
ไม่สำคัญตอนนี้ ... เพิ่มขึ้นมาก :)
แซม

1
@RiteshGune ดูคำตอบของฉันด้านล่าง
James Wald

11
การแก้ไขโค้ดเพื่อแก้ไขข้อบกพร่องใน IDE ไม่ใช่วิธีแก้ปัญหามากนัก
Jeffrey Blattman

2
มันใช้งานไม่ได้หรืออย่างน้อยก็ไม่ใช่ในขณะนี้ (Android Studio 0.8.9)
Konrad Morawski

2
มากกว่าหนึ่งปีต่อมาและยังไม่ได้รับการแก้ไข :(
ไก่

73

แทนที่จะแก้ไขโค้ดแอปพลิเคชันของคุณคุณสามารถหลีกเลี่ยงข้อบกพร่องนี้ได้โดยการแก้ไขซอร์สโค้ดของ Android SDK

เมื่อคุณพบข้อผิดพลาด getClass () ให้ไปที่การประกาศเมธอด (⌘Bบน Mac) สิ่งนี้จะนำทางไปยังเส้นทางเช่น$ANDROID_HOME/sources/android-20/java/lang/Object.java. ตอนนี้ภายใน IntelliJ หรือ Android Studio:

  • ทำให้สามารถเขียนได้โดยการเลือกObject.java File -> Make File Writableคุณอาจได้รับแจ้งให้ดำเนินการนี้โดยอัตโนมัติหากคุณพยายามแก้ไขไฟล์
  • ลบสัญลักษณ์ที่ไม่ถูกผูกไว้:

    // ลบสัญลักษณ์แทน (Class) ที่ไม่ถูกผูกไว้เพื่อหลีกเลี่ยงhttp://youtrack.jetbrains.com/issue/IDEA-72835 คลาสเนทีฟสุดท้ายสาธารณะ getClass ();

ดูเหมือนว่า Android Studio เวอร์ชันใหม่กว่าจะประสบกับข้อบกพร่องซึ่งทำให้คุณไม่สามารถแก้ไขไฟล์ได้แม้ว่าจะประกาศว่าเขียนได้แล้วก็ตาม ให้คัดลอกเส้นทางEdit -> Copy Pathหรือ⇧⌘Cแทนและแก้ไขในโปรแกรมแก้ไขที่คุณชื่นชอบ

การเปลี่ยนแปลงนี้จะรักษาฟังก์ชันการนำทางต้นทาง ตัวเลือกอื่น:

  • คุณสามารถแสดงความคิดเห็นในการgetClass()ประกาศทั้งหมด
  • คุณอาจจะผนวกเป็นส่วนขยายที่ไม่ใช่ Java เพื่อชื่อของไฟล์เช่นObject.javaObject.java.in

James Wald คำตอบที่ดี +1
Ritesh Gune

2
อันที่จริงฉันคิดว่านี่ควรเป็นคำตอบที่ยอมรับได้
Thomas Keller

1
อัปเดตคำตอบเพื่อให้สอดคล้องกับข้อเท็จจริงที่ว่า Android Studio มีข้อบกพร่องซึ่งไม่อนุญาตให้Object.javaแก้ไขแม้ว่าจะล้างค่าสถานะแบบอ่านอย่างเดียวแล้วก็ตาม
James Wald

2
นี่คือรายงานข้อบกพร่องของAndroid Studio
ฟิลิป

การแสดงความคิดเห็นเฉพาะเมธอด getClass เท่านั้นที่ทำให้ IntelliJ / Studio บ่นinstance.getClass()(ใช้ได้getClass()ผลเท่านั้น) การเปลี่ยนชื่อObject.javaไฟล์เพื่อปิดใช้งานไม่ได้ผล
Pierre-Luc Paour

9

ส่ง "getClass" ของคุณไปที่ Object ใช้

((Object) this).getClass()

สำหรับผู้ที่มีปัญหาเกี่ยวกับชิ้นส่วนนี้ให้ใช้

((Object) fragment).getClass()

3
อันที่จริงคุณไม่ได้ส่งผลลัพธ์ getClass () คุณโยนวัตถุที่คุณอยู่ในขณะนี้ (สิ่งนี้) เพื่อให้ถือว่าเป็นวัตถุ
Jorge Aguilar

6
สิ่งนี้อาจสมควรได้รับเหรียญทองสำหรับวิธีแก้ปัญหาที่น่าอับอายที่สุดเท่าที่ Java IDE ต้องการ การแคสต์ Java Object ไปยัง Object ความว่างที่น่าประทับใจ
นิโคลัส

8

ครั้งแรกของทั้งหมดที่เกี่ยวข้องกับปัญหาของ Android สตูดิโอเป็นที่นี่ โปรดติดดาวเพื่อให้ได้รับความสนใจ!

นอกจากนี้ยังมีปัญหา IntelliJ ที่เกี่ยวข้องคือที่นี่

วิธีแก้ปัญหาที่ดีสำหรับกรณีนี้คือการเปลี่ยนชื่อ<sdk>/android-<platform>/java/lang/Object.javaเป็นObject.java.XXXเช่น วิธีนี้จะป้องกันไม่ให้ AS เห็นและปัญหาจะหลีกเลี่ยงได้ แน่นอนว่าการทำเช่นนี้คุณไม่สามารถนำทางไปยังแหล่งที่มาของวัตถุจากภายใน AS ได้อย่างง่ายดายอีกต่อไป

คุณสามารถเปลี่ยนชื่อไฟล์กลับเป็นชื่อเดิมได้เมื่อจุดบกพร่องนี้จะได้รับการแก้ไข ...


2

วันนี้ฉันพบปัญหาเดียวกันเมื่อฉันสร้างโครงการใหม่ เปรียบเทียบกับโครงการอื่นที่ไม่มีปัญหานี้แล้วพบความแตกต่างอย่างหนึ่ง โครงการเก่าสร้างขึ้นโดยต่อต้าน "Android 4.2.2" ในขณะที่โครงการใหม่ตั้งค่าเป็น "แพลตฟอร์ม Android API 19" โดยค่าเริ่มต้น ฉันเปลี่ยนเป็น "Android 4.2.2" ซึ่งเท่ากับ API 17 และเครื่องหมายข้อผิดพลาดสีแดงหายไป API 17 เพียงพอสำหรับโครงการของฉันดังนั้นฉันจึงปล่อยไว้แบบนี้ได้ ฉันไม่รู้ว่าทำไมสิ่งนี้จึงช่วยแก้ปัญหาได้พูดตามตรง


1

ฉันพบวิธีแก้ไขสำหรับสิ่งนี้อย่างน้อยก็ในตอนท้ายของฉัน เป็นบั๊กของ IntelliJ อย่างแน่นอน แต่ดูเหมือนว่าจะเกิดจากความขัดแย้งระหว่างคลาสใน sourcepath และใน classpath สำหรับ Android SDK

หากคุณไปที่ Project Structure> SDKs> {{Your Android SDK}} ให้ลบรายการ Android ออกจากแท็บ Sourcepath ปัญหาในการแก้ปัญหานี้คือคุณไม่สามารถเข้าถึงแหล่งข้อมูลโดยตรงจากภายใน IntelliJ / Android Studio ได้อีกต่อไป

ฉันได้โพสต์ข้อมูลเดียวกันในตัวติดตามปัญหาของ Jetbrainsดังนั้นหวังว่าเราจะได้รับการแก้ไขในไม่ช้า


ตอนนี้มีการแก้ไข มันอาจจะรวมอยู่ใน v0.9.3
pfmaggi

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