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中:
- 通过select
File -> Make File Writable使Object.java可File -> 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();