Android Studio-모호한 메소드 호출 getClass ()


130

Android 애플리케이션에 Android Studio를 사용하고 있습니다.
내 코드가 작동하고 컴파일됩니다.
최근 IDE는 다음 코드의 getClass에서 오류 (빨간 줄)를 표시합니다.

fragment.getClass().getSimpleName()

그러나 여전히 응용 프로그램이 컴파일되고 실행됩니다.
오류는 다음과 같습니다

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

어떤 사람이 그것에 대해 설명 할 수 있습니까? 왜 코드가 여전히 실행됩니까?



같은 오류가 발생하지만 여전히 앱을 조립하고 실행할 수 있습니다.
Jason Robinson

답변:


255

Android Studio의 버그라고 생각합니다. 아시다시피 Android Studio는 IntelliJ 플랫폼 및 IntelliJ IDEA Community Edition의 기존 기능을 기반으로합니다.

Google은 JetBrains와 협력하여 개발했습니다. IntelliJ에서도 동일한 버그가 발생하는 것으로보고되었습니다. 오류 보고서를 살펴보십시오

유일한 해결 방법 이 문제는 전화 인스턴스 캐스트합니다 getClass()에,에서를 Object다음과 같이 :

((Object) this).getClass()

20
지금 중요하지 않습니다 ... 너무 많이 찬송 :)
Sam

1
@RiteshGune는 내 대답은 아래를 참조
제임스 월드

11
IDE에서 버그를 해결하도록 코드를 수정하는 것은 그리 큰 해결책이 아닙니다.
Jeffrey Blattman 2014 년

2
그것은 작동 여부를 현재 이상 (안드로이드 스튜디오 0.8.9)하지 않습니다
콘라드 Morawski

2
1 년이 지난 후에도 여전히 수정되지 않았습니다. (
Kai

73

애플리케이션 코드를 수정하는 대신 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.

James Wald, 좋은 답변, +1
Ritesh Gune

2
실제로 나는 이것이 받아 들일만한 대답이어야한다고 생각합니다.
토마스 켈러

1
Object.java읽기 전용 플래그를 지운 후에도 편집 할 수없는 버그가 Android Studio에 있다는 사실을 반영하여 답변을 업데이트했습니다 .
James Wald

2
다음Android Studio 버그 보고서입니다.
Phil

getClass 메소드에 대해서만 주석을 달면 IntelliJ / Studio가 불만을 제기합니다 instance.getClass()( getClass()작동 만 ). Object.java파일 이름을 바꾸면 파일이 작동하지 않습니다.
Pierre-Luc Paour

9

"getClass"를 객체에 캐스트하십시오.

((Object) this).getClass()

조각 에이 문제가있는 사람들은

((Object) fragment).getClass()

3
실제로, 당신은 getClass () 결과를 캐스트하지 않고, 당신이 (현재)있는 오브젝트를 캐스트하여 오브젝트로 취급합니다.
Jorge Aguilar

6
이것은 아마도 Java IDE가 요구하는 가장 악명 높은 해결 방법으로 금메달을받을 가치가 있습니다. 자바 객체를 객체로 캐스팅, 인상적인 공허함.
Snicolas 2016 년

8

모든 관련 Android Studio 문제는 여기에 있습니다 . 주의를 기울일 수 있도록 별표를 표시하십시오!

또한 관련 IntelliJ 문제는 여기에 있습니다 .

이에 대한 좋은 해결 방법 은 예를 들어 로 이름 <sdk>/android-<platform>/java/lang/Object.java을 바꾸는 것 Object.java.XXX입니다. 이렇게하면 AS가이를 볼 수 없으며 문제를 피할 수 있습니다. 물론 이렇게하면 더 이상 AS 내에서 더 이상 Object의 소스로 쉽게 이동할 수 없습니다.

이 버그가 수정되면 파일 이름을 원래 이름으로 되돌릴 수 있습니다.


2

오늘 새 프로젝트를 만들 때 같은 문제가 발생했습니다. 이 문제가없는 다른 프로젝트와 비교하여 한 가지 차이점을 발견했습니다. 이전 프로젝트는 "Android 4.2.2"에 대해 빌드되었지만 새 프로젝트는 기본적으로 "Android API 19 플랫폼"으로 설정되었습니다. API 17과 동일한 "Android 4.2.2"로 변경하고 빨간색 오류 표시가 사라졌습니다. API 17은 내 프로젝트에 충분 하므로이 방법으로 떠날 수 있습니다. 솔직히 말해서 이것이 왜 문제를 해결하는지 모르겠습니다.


1

나는 적어도 내 목표에 대한 해결책을 찾았습니다. 분명히 IntelliJ 버그이지만 소스 경로의 클래스와 Android SDK의 클래스 경로 사이의 충돌로 인한 것 같습니다.

프로젝트 구조> SDK> {{Your Android SDK}}로 이동하면 소스 경로 탭에서 모든 Android 항목을 제거하십시오. 이 대안의 문제점은 더 이상 IntelliJ / Android Studio 내에서 소스에 직접 액세스 할 수 없다는 것입니다.

Jetbrains 이슈 트래커 에 동일한 정보를 게시 했으므로 곧 수정 될 것입니다.


이제 수정되었습니다. 그것은 아마도 v0.9.3에 포함됩니다
pfmaggi

1

fragment.class.getSimpleName ()을 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.