在Java中更改Import的名称,或导入两个具有相同名称的类

Fed*_*rer 335 java import

在Python中你可以做一个:

from a import b as c
Run Code Online (Sandbox Code Playgroud)

您将如何在Java中执行此操作,因为我有两个冲突的导入.

Boz*_*zho 431

Java中没有导入别名机制.您不能导入两个具有相同名称的类,并且使用两个不合格的类.

导入一个类并使用另一个类的完全限定名称,即

import com.text.Formatter;

private Formatter textFormatter;
private com.json.Formatter jsonFormatter;
Run Code Online (Sandbox Code Playgroud)

  • 这仍然是Java 8中的限制吗? (18认同)
  • 这是正确的答案,我只会添加你暗示的内容:不,Java中没有这样的别名语法. (15认同)
  • 是的我同意你的评论linuxdan ... Java在语法更新方面已经走上了恐龙之路. (12认同)
  • @HairOfTheDog Nope,遗憾的是Java8中没有添加任何导入别名 (8认同)
  • @Bozho python的方式:`import [fully-qualified-name] as [ident]`."as"关键字似乎也不适合Java,另一种选择大致是C#使用的:`import [ident] = [fully-qualified-name]`. (5认同)
  • 如果我的语言A具有外语B未命中的功能:哇,A如何优越.如果外语B具有A错过的功能:meh,我不明白为什么那么重要......(是的,我在谈论你,[Blub Paradox](http://www.paulgraham. COM/avg.html)). (5认同)
  • 嘘java.+1回答. (2认同)
  • 相反,它是在 kotlin 中实现的,出于这个原因以及其他巨大的原因,我将把我的 spring 项目切换到 kotlin (2认同)

sfu*_*ger 57

值得注意的是,Groovy具有以下功能:

import java.util.Calendar
import com.example.Calendar as MyCalendar

MyCalendar myCalendar = new MyCalendar()
Run Code Online (Sandbox Code Playgroud)

  • 在Kotlin:`import com.example.Calendar as MyCalendar`. (19认同)
  • 在Scala中它是:`import com.example.{Calendar => MyCalendar}` (15认同)
  • 看到(至少)3种基于JVM的语言(Groovy,Scala和Kotlin)具有此功能但Java本身仍然没有...这是非常烦人的... (14认同)
  • 在PHP中它是:使用com\example\Calendar作为MyCalendar (11认同)
  • 在 ES6 中,它是 `import { Calender as MyCalendar } from "com/example/calendar" (2认同)
  • 像“类MyCalendar扩展了com.example.Calendar {}”这样的东西呢?它不是理想的或漂亮的,但它应满足大多数目的,例如反射。您甚至可以在必要时添加注释,例如`/ * import com.example.Calendar as MyCalendar * /`。 (2认同)

sie*_*egi 54

正如其他答案已经说明的那样,Java不提供此功能.

已多次请求实现此功能,例如JDK-4194542:类名称别名JDK-4214789:扩展导入以允许重命名导入的类型.

来自评论:

这不是一个不合理的要求,尽管不是必需的.偶尔使用完全限定名称并不是一个不适当的负担(除非库真的重复使用左右相同的简单名称,这是不好的风格).

无论如何,它不会通过语言变化的价格/性能标准.

所以我想我们很快就不会在Java中看到这个功能:-P

  • 绝对不正确.我面临一个非常简单的场景,可能非常常见,这种语法糖会非常有用.相关但不同的对象模型(分别用于相关但不同的产品)之间的转换,其类大多数时间共享相同的名称.转换过程要求您在同一代码块中引用这两个类.在这种情况下(必须非常普遍),Java使生活变得非常困难.只是这篇文章的观点数量应该告诉你这个故事. (16认同)
  • 哇!你不是在开玩笑说"不要......(不久)",我看到功能要求早在1998年就被视为毫无意义的糖!在过去的18年里,每一次重新开展讨论的尝试都搁浅了对这一古老决定的提及.我想说服IDE开发人员在编辑器中实现这个作为掩码而不是试图将感觉转化为Oracle会更容易. (12认同)
  • 我不同意这些冲突很少发生.面向对象有利于简单命名.我可以从两个不同的库中创建一个类Employee,它与员工分开(例如). (12认同)
  • @slim"_in练习这些冲突很少发生_".我不清楚为什么这些情况在java(你可以拥有10.000多个类)中比在其他语言(你通常拥有更少的类)中更少发生,而_do_支持这种"糖"语法. (5认同)
  • “无论如何,它都没有通过语言更改的性价比标准。” - 这几乎概括了 Java 设计如此糟糕的原因。例如,Scala 很久以前就解决了这个问题。 (3认同)
  • 如果“这些冲突很少发生”,那么这个问题就不会得到那么多想知道如何做的人的支持。 (3认同)
  • 不过,旧的推理是正确的-实际上,这些冲突很少发生。 (2认同)
  • 这对我来说是一个持续的负担,我在每个项目和我自己的公共库中都会遇到这种负担。您在服务器包和客户端包中都有一个“控制器”,但您被迫命名为 ClientController 和 ServerController。我最终在每个类前面添加了包名称,所以我最终得到了 ControlButton、ControlTextBox、ControlListBox 等。这是解决这个非常烦人的问题的唯一方法。 (2认同)

sep*_*p2k 18

Java不允许你这样做.您需要通过其完全限定名称引用其中一个类,并仅导入另​​一个类.


Chr*_*ski 14

今天我向 OpenJDK 提交了一份关于这个别名特性的 JEP 草案。我希望他们会重新考虑。

如果您有兴趣,可以在这里找到 JEP 草案:https : //gist.github.com/cardil/b29a81efd64a09585076fe00e3d34de7


kan*_*ane 14

可笑的是java还没有这个。斯卡拉有它

import com.text.Formatter
import com.json.{Formatter => JsonFormatter}

val Formatter textFormatter;
val JsonFormatter jsonFormatter;
Run Code Online (Sandbox Code Playgroud)


Dar*_*zka 6

除非非默认构造函数出现问题,否则您始终可以这样做(同时我们都在等待 Java 语言规范赶上):

public class YaddaYadda
{
    private static class ZU extends eu.zrbj.util.ZrbjUtil_3_0 { }

    public void foo (String s)
    {
        if (ZU.isNullOrEmpty(s))
        {
            // ...
Run Code Online (Sandbox Code Playgroud)

对于项目范围内的使用,“导入”类可以进入单独的类文件,为导入提供单点定义。

这是一个救星,特别是对于“库”类,即静态实用函数的集合。一方面,它使您能够对这些野兽进行版本控制(如示例所示),而不会给用户带来重大不便。