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
今は関係ありません...非常に高く評価します:)
サム

1
@RiteshGune以下の私の回答をご覧ください
James Wald

11
IDEのバグを回避するようにコードを変更することは、あまり解決策ではありません。
Jeffrey Blattman、2014

2
動作しない、または少なくとも現在は動作していない(Android Studio 0.8.9)
Konrad 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 public final native Class getClass(); を回避するために、無制限のワイルドカード(クラス)を削除しました

Android Studioの新しいバージョンには、書き込み可能と宣言した後でもファイルを編集できないというバグがあるようです。代わりに、パスEdit -> Copy Pathまたは⇧⌘Cをコピーして、お気に入りのエディターで編集します。

この変更により、ソースナビゲーション機能が保持されます。別のオプション:

  • getClass()宣言全体をコメント化できます。
  • Object.javaファイル名にJava以外の拡張子を追加できますObject.java.in

ジェームズウォルド、いい答え、+ 1
リテッシュギュネ

2
実はこれが正解だと思います。
トーマスケラー14

1
回答を更新し、Android StudioにはObject.java読み取り専用フラグをクリアした後でも編集できないバグがあるという事実を反映しました。
James Wald

2
こちらAndroid Studioのバグレポートです。
フィル14

getClassメソッドにコメントを付けるだけで、IntelliJ / Studioは文句を言いますinstance.getClass()getClass()機能します)。Object.java無効にするためにファイルの名前を変更しても機能します。
Pierre-Luc Paour 2014

9

「getClass」をオブジェクトにキャストし、使用

((Object) this).getClass()

フラグメントでこの問題が発生している場合は、

((Object) fragment).getClass()

3
実際には、getClass()の結果をキャストするのではなく、現在処理中のオブジェクト(this)をキャストして、オブジェクトとして処理します。
ホルヘアギラール

6
これはおそらく、Java IDEが必要とする最も悪名高い回避策として金メダルに値します。Javaオブジェクトからオブジェクトへのキャスト、印象的な空虚さ。
Snicolas 2014年

8

まず、関連するAndroid Studioの問題はこちらです。注目を集められるようにスターを付けてください!

また、関連するIntelliJの問題もここにあります

これの良い回避策は、例えばに名前<sdk>/android-<platform>/java/lang/Object.javaを変更することObject.java.XXXです。これはASがそれを見るのを防ぎ、問題は回避されます。もちろん、これを行うと、AS内からObjectのソースに簡単に移動できなくなります。

このバグが修正されるときに、ファイルの名前を元の名前に戻すことができます...


2

今日、私は新しいプロジェクトを作成したときに同じ問題に遭遇しました。この問題のない別のプロジェクトと比較したところ、1つの違いが見つかりました。古いプロジェクトは「Android 4.2.2」に対してビルドされましたが、新しいプロジェクトはデフォルトで「Android API 19 Platform」に設定されていました。これを「Android 4.2.2」に変更しました。これはAPI 17に相当し、赤いエラーマーカーが消えました。私のプロジェクトではAPI 17で十分なので、このままにしておくことができます。正直なところ、これで問題が解決する理由はわかりません。


1

私はこれの修正を、少なくとも私の側で見つけました。これは間違いなくIntelliJのバグですが、Android SDKのソースパスとクラスパスのクラス間の競合が原因であるようです。

[プロジェクト構造]> [SDK]> [{{あなたのAndroid SDK}}]に移動した場合は、[ソースパス]タブからAndroidエントリを削除します。この回避策の問題は、IntelliJ / Android Studio内からソースに直接アクセスできなくなったことです。

Jetbrainsの課題追跡に同じ情報を投稿したので、うまくいけばすぐに修正されるでしょう。


修正されました。おそらくv0.9.3に含まれるでしょう
pfmaggi

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.