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 Platform和IntelliJ IDEA Community Edition的现有function。

Google已经与JetBrains合作开发了它。 IntelliJ也会报告同样的错误。 看看错误报告

解决此问题的唯一方法是将您调用getClass()的实例getClass()Object ,如下所示:

 ((Object) this).getClass() 

修改您的应用程序代码,而不是修改您的Android SDK的源代码,可以避免这个错误 。

当遇到getClass()错误时,请转到该方法的声明(Mac上的⌘B)。 这将导航到一个path,如$ANDROID_HOME/sources/android-20/java/lang/Object.java 。 现在,在IntelliJ或Android Studio中:

  • 通过selectFile -> Make File Writable使Object.javaFile -> Make File Writable 。 如果您尝试编辑文件,可能会提示您自动执行此操作。
  • 删除无界通配符:

    //删除无界通配符(Class)以避免http://youtrack.jetbrains.com/issue/IDEA-72835 public final native Class getClass();

较新版本的Android Studio似乎受到一个错误的影响,即使在将其声明为可写之后也无法编辑该文件。 相反,复制path, Edit -> Copy Path或⇧⌘C,并编辑它在您最喜爱的编辑器。

此更改将保留源导航function。 其他选项:

  • 您可以注释掉整个getClass()声明。
  • 您可以在Object.java文件的名称后附加一个非Java扩展名,例如Object.java.in

把你的“getClass”转换成一个Object,使用

 ((Object) this).getClass() 

对于那些有碎片的问题,请使用

 ((Object) fragment).getClass() 

首先相关的Android Studio问题在这里 。 请明星,这样可以得到一些关注!

此外相关的IntelliJ问题在这里

一个很好的解决方法是将<sdk>/android-<platform>/java/lang/Object.java重命名为Object.java.XXX 。 这将防止AS看到它,这个问题将被避免。 当然,通过这样做,您不能再轻松地从AS内导航到Object的源。

当这个错误将被修复时,你可以重命名文件到它的原始名称。

今天我创build一个新项目时遇到了同样的问题。 我比较了另一个没有这个问题的项目,发现有一个区别。 旧项目是针对“Android 4.2.2”而构build的,而新项目默认设置为“Android API 19 Platform”。 我把它改成“Android 4.2.2”,等于API 17,红色的错误标记消失了。 API 17足以满足我的项目,所以我可以这样离开它。 我不知道为什么这个问题能够解决,说实话。

我find了一个解决办法,至less在我的最后。 这绝对是一个IntelliJ错误,但似乎是源SDK中的类和Android SDK的类path之间的冲突造成的。

如果您转到“项目结构”>“SDK”>“{您的Android SDK}”,请从“源path”选项卡中删除所有Android条目。 此变通办法的问题是,您不再有直接访问IntelliJ / Android Studio中的来源。

我已经在Jetbrains问题跟踪器上发布了相同的信息,所以希望我们很快会看到一个修复程序。

只要使用fragment.class.getSimpleName();