[android] Android Studio-모호한 메소드 호출 getClass ()
Android 애플리케이션에 Android Studio를 사용하고 있습니다.
내 코드가 작동하고 컴파일됩니다.
최근 IDE는 다음 코드의 getClass에서 오류 (빨간 줄)를 표시합니다.
fragment.getClass().getSimpleName()
그러나 여전히 응용 프로그램이 컴파일되고 실행됩니다.
오류는 다음과 같습니다
Ambiguous method call. Both
getClass () in Object and
getClass () in Object match.
어떤 사람이 그것에 대해 설명 할 수 있습니까? 왜 코드가 여전히 실행됩니까?
답변
Android Studio의 버그라고 생각합니다. 아시다시피 Android Studio는 IntelliJ 플랫폼 및 IntelliJ IDEA Community Edition의 기존 기능을 기반으로합니다.
Google은 JetBrains와 협력하여 개발했습니다. IntelliJ에서도 동일한 버그가 발생하는 것으로보고되었습니다. 오류 보고서를 살펴보십시오
유일한 해결 방법 이 문제는 전화 인스턴스 캐스트합니다 getClass()
에,에서를 Object
다음과 같이 :
((Object) this).getClass()
답변
애플리케이션 코드를 수정하는 대신 Android SDK의 소스 코드를 패치 하여이 버그 를 피할 수 있습니다 .
getClass () 오류가 발생하면 메소드 선언으로 이동하십시오 (Mac의 경우 ⌘B). 이 같은 경로로 이동합니다 $ANDROID_HOME/sources/android-20/java/lang/Object.java
. 이제 IntelliJ 또는 Android Studio 내에서 :
Object.java
을 선택하여 쓰기 가능하게 만드십시오File -> Make File Writable
. 파일을 편집하려고하면이 작업을 자동으로 수행하라는 메시지가 표시 될 수 있습니다.-
제한없는 와일드 카드를 제거하십시오.
// 무제한 와일드 카드 (클래스)를 제거하여 http://youtrack.jetbrains.com/issue/IDEA-72835
공개 최종 네이티브 클래스 getClass ();
최신 버전의 Android Studio에서는 쓰기 가능한 것으로 선언 한 후에도 파일을 편집 할 수없는 버그가 발생하는 것으로 보입니다. 대신 경로 Edit -> Copy Path
또는 ⇧⌘C를 복사 하여 즐겨 사용하는 편집기에서 편집하십시오.
이 변경 사항은 소스 탐색 기능을 유지합니다. 다른 옵션:
getClass()
선언 전체를 주석 처리 할 수 있습니다 .Object.java
파일 이름에 Java 이외의 확장자를 추가 할 수 있습니다 ( 예 🙂Object.java.in
.
답변
“getClass”를 객체에 캐스트하십시오.
((Object) this).getClass()
조각 에이 문제가있는 사람들은
((Object) fragment).getClass()
답변
모든 관련 Android Studio 문제는 여기에 있습니다 . 주의를 기울일 수 있도록 별표를 표시하십시오!
또한 관련 IntelliJ 문제는 여기에 있습니다 .
이에 대한 좋은 해결 방법 은 예를 들어 로 이름 <sdk>/android-<platform>/java/lang/Object.java
을 바꾸는 것 Object.java.XXX
입니다. 이렇게하면 AS가이를 볼 수 없으며 문제를 피할 수 있습니다. 물론 이렇게하면 더 이상 AS 내에서 더 이상 Object의 소스로 쉽게 이동할 수 없습니다.
이 버그가 수정되면 파일 이름을 원래 이름으로 되돌릴 수 있습니다.
답변
오늘 새 프로젝트를 만들 때 같은 문제가 발생했습니다. 이 문제가없는 다른 프로젝트와 비교하여 한 가지 차이점을 발견했습니다. 이전 프로젝트는 “Android 4.2.2″에 대해 빌드되었지만 새 프로젝트는 기본적으로 “Android API 19 플랫폼”으로 설정되었습니다. API 17과 동일한 “Android 4.2.2″로 변경하고 빨간색 오류 표시가 사라졌습니다. API 17은 내 프로젝트에 충분 하므로이 방법으로 떠날 수 있습니다. 솔직히 말해서 이것이 왜 문제를 해결하는지 모르겠습니다.
답변
나는 적어도 내 목표에 대한 해결책을 찾았습니다. 분명히 IntelliJ 버그이지만 소스 경로의 클래스와 Android SDK의 클래스 경로 사이의 충돌로 인한 것 같습니다.
프로젝트 구조> SDK> {{Your Android SDK}}로 이동하면 소스 경로 탭에서 모든 Android 항목을 제거하십시오. 이 대안의 문제점은 더 이상 IntelliJ / Android Studio 내에서 소스에 직접 액세스 할 수 없다는 것입니다.
Jetbrains 이슈 트래커 에 동일한 정보를 게시 했으므로 곧 수정 될 것입니다.
답변
fragment.class.getSimpleName ()을 사용하십시오.