相关疑难解决方法(0)

为什么我不能在Java中"静态导入"一个"equals"方法?

我喜欢在这里使用这个方法:

org.apache.commons.lang.ObjectUtils.equals(Object object1, Object object2)
Run Code Online (Sandbox Code Playgroud)

唯一的缺点(例如,与Google Guava相比),我无法静态导入该方法.即这没用:

import static org.apache.commons.lang.ObjectUtils.equals;
Run Code Online (Sandbox Code Playgroud)

...因为我的Eclipse编译器在编写时无法正确链接该方法

equals(obj1, obj2);
Run Code Online (Sandbox Code Playgroud)

错误是:

Object类型中的方法equals(Object)不适用于参数(...,...)

这是为什么?如果在任何超类型中存在具有相同名称(但不是相同的签名)的方法,我的静态导入方法是否不适用?这是在JLS中正式指定的吗?还是一些Eclipse编译问题?

UPDATE

这也不起作用:

import static org.apache.commons.lang.ObjectUtils.defaultIfNull;

public class Test {
  void test() {
    defaultIfNull(null, null);
    // ^^ compilation error here
  }

  void defaultIfNull() {
  }
}
Run Code Online (Sandbox Code Playgroud)

javac错误消息:

Test.java:5: defaultIfNull() in Test cannot be applied to (<nulltype>,<nulltype>)
defaultIfNull(null, null);
    ^
1 error
Run Code Online (Sandbox Code Playgroud)

java import static compiler-errors equals

29
推荐指数
5
解决办法
3859
查看次数

变量和顶级包名称之间的Java名称冲突

由此错误报告AVRO-1814触发我将问题简化为Java中的这个最小示例,简单地显示了效果的核心.

package nl.basjes.experiment;

public class NamingClash {
  String nl = "foo";

  public void test() {
    nl.basjes.experiment.NamingClash.foo();
  }

  private static void foo() {
    // Do something
  }
}
Run Code Online (Sandbox Code Playgroud)

试图编译这将给你

error: cannot find symbol
    nl.basjes.experiment.NamingClash.foo();
      ^
  symbol:   variable basjes
  location: variable nl of type String
Run Code Online (Sandbox Code Playgroud)

在AVRO中,生成代码并且必须尝试避免名称冲突,假设人们有时会选择意外的名称.

所以假设在这个例子中

  1. 需要'test()'方法中的完全限定类名来避免冲突.
  2. 变量'nl'只是模式定义中使用的名称.
  3. 生成像_nl__这样的字段并具有getter和setter将是一个会破坏向后兼容性的更改,因为nl字段始终是公共的.

除了告诉人们"就是不要那样做".

有避免这些冲突的解决方案吗?


请注意,对于触发此问题的AVRO错误,我找到了一种解决方法.在这里,我正在寻找'通用答案'.

java namespaces name-collision

6
推荐指数
1
解决办法
1028
查看次数