对我而言,很明显这个问题的答案是 NO ,但就在今天我来到了这一行
Context.setCredentials(userId, pwd.toCharArray());
其中 setCredentials 是非静态方法。 Intellij IDEA强调这是一个错误,因此我的项目没有编译,但是,在Eclipse中一切正常,它是如何?
解决问题不是问题,但我想了解为什么会发生这种情况。附:我可能会认为这可能是特定于项目的。
更新
在调用 setCredentials 之前,会发生另一个调用:
Context.initContext()
我们在哪里调用以下方法:
synchronized private static void initContext(String connectionString) {
if (_this == null) {
_this = new Context(connectionString);
}
}
其中this
在同一个Context类中定义如下:
private static Context _this;
似乎它可能会起作用,Eclipse会在我们的实例创建时显示它,但是,它在类中,真是奇怪的代码。
答案 0 :(得分:0)
清理并重建您的项目。要调用任何非静态方法,您必须具有该类的实例。
注意:您无法在Java中的任何静态方法中访问非静态变量,但反向很好,即您可以从非静态方法访问静态变量或调用静态方法,而不会出现任何编译时错误。
答案 1 :(得分:0)
好的,答案很清楚否,但现在我会尝试解释为什么会这样。实际上,Java没有什么可做的,它更多的是关于IDE,而是关于 项目设置 的更多信息。
该项目最初是在Eclipse中开发的,但是,在我尝试在Intellij IDEA中构建它时,我没有包含 Eclipse项目设置 ,因此IDEA认识到它是来源并试图编译。这就是它抱怨的原因。
所以,问题是在Eclipse中,包含此类的文件夹中的包含,但是,所有文件都在同一时间排除。因此,编译器不包含此文件,Eclipse不会显示错误。我想注意,因为我没有太多使用Eclipse的经验,所以很难找到它,而且我没有认识到源文件图标之间的以下区别:
然而,在Intellij IDEA中,我认为可以更快地识别出来:
我认为最好对这种情况做出结论:如果您没有特定的理由,不要从源文件夹中排除任何文件。如果不维护此代码,最好将其删除或移动到其他位置。
答案 2 :(得分:0)
答案是Java 8中的是。这是因为称为方法引用(Lambda表达式)的概念。
示例: 在图像中,如果您看到“ compareToIgnoreCase ”实际上是一个非静态方法,我在没有实际创建String类实例的情况下就调用了该方法。这个概念称为方法参考。
答案 3 :(得分:-1)
这显然是一个IDE错误。
尝试清理构建,确保没有其他错误。
你应该尽量不要盲目依赖编译器消息,错误在eclipse和Android Studio中都很常见,甚至Xcode有时会变得疯狂。
希望这有帮助。