我在Android应用程序中使用Android Studio
我的代码可以工作和编译
最近,IDE在getClass上显示以下代码的错误(红线):
fragment.getClass().getSimpleName()
但是应用程序仍在编译和运行 错误是:
Ambiguous method call. Both
getClass () in Object and
getClass () in Object match.
有人可以解释一下它的含义吗?为什么代码仍在运行?
答案 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()
声明。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();