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();