Android Studio - getClass()方法调用模糊

130

我正在使用Android Studio开发Android应用程序。
我的代码可以正常工作并编译。
最近,IDE在下面的代码中的getClass上显示了错误(红色线条):

fragment.getClass().getSimpleName()

但是该应用程序仍然可以编译和运行。
错误信息为:

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

有人能解释一下这是关于什么的吗?为什么代码还在运行?


我也遇到了同样的错误,但是我仍然可以成功地组装和运行应用程序。 - Jason Robinson
6个回答

255

我认为这是Android Studio中的一个错误。正如我们所知,Android Studio是基于IntelliJ平台和现有的IntelliJ IDEA社区版功能开发的。

Google与JetBrains合作开发了它。同样的bug也被报告在IntelliJ中发生。 请查看错误报告

唯一的解决方法是将你调用getClass()的实例转换为Object,如下:

((Object) this).getClass()

20
现在不重要了...有这么多赞 :) - Sam
1
@RiteshGune 请看下面的答案。 - James Wald
11
调整代码以解决 IDE 中的错误并不是一个很好的解决方案。 - Jeffrey Blattman
2
它不起作用,或者至少目前不起作用(Android Studio 0.8.9)。 - Konrad Morawski
2
一年多过去了,它仍然没有被修复 :( - Kai
显示剩余4条评论

73

不需要修改应用程序代码,你可以通过打补丁来修复你的Android SDK源代码以避免这个错误

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

  • 通过选择文件 -> 使文件可写 使Object.java可写。如果尝试编辑该文件,则可以自动提示您执行此操作。
  • 删除无界限通配符:

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

较新版本的Android Studio似乎存在一个错误,即使声明为可写,也会防止您编辑该文件。相反,将路径复制,编辑 -> 复制路径 或者 ⇧⌘C,在您喜欢的编辑器中进行编辑。

此更改将保留源代码导航功能。其他选项:

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

James Wald,好答案,+1。 - Ritesh Gune
2
实际上,我认为这应该是被接受的答案。 - Thomas Keller
1
更新了答案以反映Android Studio存在一个错误,即使清除只读标记也无法编辑Object.java - James Wald
2
这是Android Studio的错误报告。 - Phil
仅仅注释掉getClass()方法会导致IntelliJ/Studio抱怨instance.getClass()(只有getClass()可以工作)。将Object.java文件重命名以禁用它是可行的。 - Pierre-Luc Paour
显示剩余3条评论

8
首先,相关的Android Studio问题在这里。 请点赞以便引起关注!
此外,相关的IntelliJ问题在这里
一个好的解决方法是将<sdk>/android-<platform>/java/lang/Object.java重命名为Object.java.XXX。这将防止AS看到它并避免出现问题。当然,这样做后,您将无法轻松地从AS中导航到Object的源代码。
当这个bug被修复时,您可以将文件重命名回其原始名称...

2
今天我创建一个新项目时遇到了同样的问题。我与另一个没有这个问题的项目进行比较,找到了一个区别。旧项目是构建在“Android 4.2.2”上,而新项目默认设置为“Android API 19 Platform”。我将其更改为“Android 4.2.2”,相当于API 17,红色错误标记消失了。API 17对我的项目已足够,因此我可以保留这种方式。说实话,我不知道为什么这样解决了问题。

1
我找到了解决方法,至少在我的设备上有效。这明显是IntelliJ的一个bug,但似乎是由源路径中的类和Android SDK的类路径之间的冲突引起的。
如果您进入项目结构> SDKs> {{Your Android SDK}},请从Sourcepath选项卡中删除任何Android条目。这种解决方法的问题是您不再可以直接访问IntelliJ / Android Studio中的源代码。
我已经在Jetbrains issue tracker上发布了相同的信息,希望我们很快能看到修复。

现在已经有一个修复方案了。它很可能会包含在v0.9.3版本中。 - pfmaggi

1
只需使用 fragment.class.getSimpleName();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接