java - Java 导入中的名称冲突

标签 java import

除非我们change the compiler , Java 缺少 import X as Y 语法,这在像我这样的情况下很有用:此时此刻,我正在处理一个项目,该项目具有多个同名但属于不同包的类.

我想要一个类似的东西

import com.very.long.prefix.bar.Foo as BarFoo
import org.other.very.long.prefix.baz.Foo as BazFoo

class X {
    BarFoo a;
    BazFoo b;
    ...
}

相反,我完成了类似的事情

class X {
    com.very.long.prefix.bar.Foo a;
    org.other.very.long.prefix.baz.Foo b;
    ...
}

这似乎非常有害,但在我的具体情况下,我需要使用水平滚动来浏览我的源代码,这会使已经一团糟的程序变得更糟。

根据您的经验,这种情况下的最佳做法是什么?

最佳答案

我感受到你的痛苦,无论你使用哪种解决方案,有两个同名的类这一事实已经足够令人困惑了。

有几种解决方案解决方法:

  1. 如果这是您的代码,只需重命名其中一个(或两个)
  2. 如果这是库(更有可能)导入更常用的类,则按照 Jeff Olson 的建议完全限定另一个。
  3. 如果可能的话,一开始就尽量避免让他们在同一个类(class)。
  4. 您可以编写自己的 BarFooBazFoo,它们除了扩展各自的 Foo 类之外什么都不做,从而为它们提供自己的名称。您甚至可以将它们定义为内部类。示例:
private BarFoo extends com.very.long.prefix.bar.Foo{
//nothing, except possibly constructor wrappers
}

private BazFoo extends com.very.long.prefix.bar.Foo{
//nothing, except possibly constructor wrappers
}

class X {
   BarFoo a;
   BazFoo b;
   //...
}

不过也有一些缺点:

  • 你必须重新定义构造函数
  • 如果您需要将它传递给显式检查其 getClass 的函数,则它不会是完全相同的类。

您可以通过包装 Foo 类而不是扩展它们来解决这些缺点,例如:

private BarFoo {
   public com.very.long.prefix.bar.Foo realFoo;
}

private BazFoo extends com.very.long.prefix.bar.Foo{
  public com.very.long.prefix.baz.Foo realFoo;
}

class X {
    BarFoo a;
    BazFoo b;

    //now if you need to pass them
    someMethodThatTakesBazFoo(b.realFoo);
}

选择最简单的解决方案,祝你好运!

关于java - Java 导入中的名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14738854/

相关文章:

R通过快捷方式读取RDS文件

javascript - ES6 import "module"不允许访问 "module"的函数

java - 使用 URI 打开图像时,顶部缺少图标

Java 日历对齐问题

java - Java中的多线程服务器程序

mysql - 从csv导入mysql时保留特殊字符

java - 当格式已知时从 String 解析 JSON 的最快方法

java - 扩展接口(interface)时返回子元素列表

python - 是否可以在不实例化类的情况下导入类方法?

java - 处理重复的完全限定名称