Android Studio-模棱两可的方法调用getClass()


130

我将Android Studio用于我的Android应用程序。
我的代码可以工作并编译。
最近,IDE向我显示了以下代码的getClass错误(红线):

fragment.getClass().getSimpleName()

但是应用程序仍然可以编译并运行。
错误是:

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

有人可以解释一下我的意思吗?为什么代码仍在运行?



我遇到同样的错误,但是我仍然可以组装并运行该应用程序。
杰森·罗宾逊

Answers:


255

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

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

解决此问题的唯一方法是将调用的实例强制getClass()转换Object为以下形式:

((Object) this).getClass()

20
没关系...这么大的投票:)
Sam

1
@RiteshGune在下面看到我的答案
James Wald

11
修改代码以解决IDE中的错误不是解决方案。
Jeffrey Blattman 2014年

2
它不起作用,或者至少当前不起作用(Android Studio 0.8.9)
Konrad Morawski 2014年

2
一年多以后,它仍然没有解决:(
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

詹姆斯·沃尔德(James Wald),不错的回答,+ 1
里特什·古尼

2
实际上,我认为这应该是公认的答案。
Thomas Keller 2014年

1
更新了答案,以反映以下事实:Object.java即使清除了只读标志,Android Studio仍不允许进行编辑。
詹姆斯·沃尔德

2
Android Studio错误报告。
菲尔(Phil)

仅注释getClass方法会使IntelliJ / Studio抱怨instance.getClass()(仅getClass()适用)。重命名Object.java文件以禁用它确实有效。
Pierre-Luc Paour 2014年

9

将您的“ getClass”强制转换为对象,使用

((Object) this).getClass()

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

((Object) fragment).getClass()

3
实际上,您不强制转换getClass()结果,而是强制转换您当前所在的对象(此对象)以将其视为对象。
豪尔赫·阿吉拉尔

6
对于Java IDE所需要的最臭名昭著的解决方法,这可能值得一枚金牌。将Java Object转换为Object,可观的真空度。
Snicolas 2014年

8

首先,相关的Android Studio问题在这里。请加注星标,以便引起注意!

相关的IntelliJ问题也在这里

一个很好的解决方法,这是重命名<sdk>/android-<platform>/java/lang/Object.javaObject.java.XXX了实例。这样可以防止AS看到它,并且可以避免该问题。当然,通过这样做,您将不再能够轻松地从AS内导航到对象的来源。

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


2

今天,当我创建一个新项目时遇到了同样的问题。我将它与另一个没有这个问题的项目进行了比较,发现了一个不同之处。旧项目是针对“ Android 4.2.2”构建的,而新项目默认情况下设置为“ Android API 19 Platform”。我将其更改为等于API 17的“ Android 4.2.2”,红色错误标记消失了。API 17足以满足我的项目要求,因此我可以采用这种方式。老实说,我不知道为什么这可以解决问题。


1

我为此找到了解决方法,至少到了最后。这绝对是IntelliJ错误,但这似乎是由Android SDK的源路径和类路径中的类之间的冲突引起的。

如果转到项目结构> SDK> {{您的Android SDK}},请从“源路径”选项卡中删除所有Android条目。此解决方法的问题是您不再可以直接从IntelliJ / Android Studio中访问源。

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


现在有一个修复程序。它可能会包含在v0.9.3中
pfmaggi

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.