Android Studio - 不明确的方法调用getClass()

时间:2013-08-29 08:36:02

标签: android android-studio

我在Android应用程序中使用Android Studio 我的代码可以工作和编译 最近,IDE在getClass上显示以下代码的错误(红线):

fragment.getClass().getSimpleName()

但是应用程序仍在编译和运行 错误是:

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

有人可以解释一下它的含义吗?为什么代码仍在运行?

7 个答案:

答案 0 :(得分:255)

我认为这是Android Studio中的一个错误。众所周知,Android Studio基于IntelliJ平台和IntelliJ IDEA Community Edition的现有功能。

Google与JetBrains合作开发了它。据报道,IntelliJ也会发生同样的错误。 看看Error report

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

((Object) this).getClass()

答案 1 :(得分:73)

您可以通过修补Android SDK的源代码来避免this bug,而不是修改您的应用程序代码。

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

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

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

较新版本的Android Studio似乎遇到了一个错误,即使在将文件声明为可写之后也无法编辑该文件。而是复制路径Edit -> Copy Path或⇧⌘C,并在您喜欢的编辑器中进行编辑。

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

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

答案 2 :(得分:9)

将“getClass”投射到对象,使用

((Object) this).getClass()

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

((Object) fragment).getClass()

答案 3 :(得分:8)

首先,相关的Android Studio问题是 here 。 请注明它以便引起注意!

相关的IntelliJ问题还有 here

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

当修复此错误时,您可以将文件重命名为其原始名称...

答案 4 :(得分:2)

今天我在创建新项目时遇到了同样的问题。我比较了另一个没有这个问题的项目,发现了一个不同之处。旧项目是针对“Android 4.2.2”构建的,而新项目默认设置为“Android API 19平台”。我改为“Android 4.2.2”,它等于API 17,红色错误标记消失了。 API 17足以支持我的项目,所以我可以这样做。老实说,我不知道为什么这会解决这个问题。

答案 5 :(得分:1)

我找到了解决方法,至少在我的结尾。它绝对是一个IntelliJ错误,但它似乎是由源路径中的类和Android SDK的类路径之间的冲突引起的。

如果你去项目结构&gt; SDKs&gt; {{您的Android SDK}},从Sourcepath选项卡中删除所有Android条目。此解决方法的问题在于您无法再从IntelliJ / Android Studio中直接访问源。

我在Jetbrains issue tracker上发布了相同的信息,所以希望我们很快就能看到修复。

答案 6 :(得分:1)

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