更改Java中导入的名称,或导入两个同名的类

更改Java中导入的名称,或导入两个同名的类,java,import,Java,Import,在Python中,您可以执行以下操作: from a import b as c 在Java中如何实现这一点,因为我有两个相互冲突的导入。Java中没有导入别名机制。不能导入同名的两个类并同时使用它们 导入一个类并使用另一个类的完全限定名,即 import com.text.Formatter; private Formatter textFormatter; private com.json.Formatter jsonFormatter; Java不允许您这样做。您需要通过完全限定名引

在Python中,您可以执行以下操作:

from a import b as c

在Java中如何实现这一点,因为我有两个相互冲突的导入。

Java中没有导入别名机制。不能导入同名的两个类并同时使用它们

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

import com.text.Formatter;

private Formatter textFormatter;
private com.json.Formatter jsonFormatter;

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

可能值得注意的是:


正如其他答案所述,Java不提供此功能

已多次请求实施此功能,例如作为或

从评论中:

这不是一个不合理的要求,尽管几乎没有必要。偶尔 使用完全限定的名称不是一个不适当的负担(除非图书馆 真正重用相同的简单名称(右和左),这是一种糟糕的风格)

在任何情况下,它都无法通过语言的性价比标准 改变


因此,我想我们不会很快在Java中看到此功能:-p

实际上,可以创建一个快捷方式,以便您可以在代码中使用较短的名称,方法如下:

package com.mycompany.installer;
public abstract class ConfigurationReader {
    private static class Implementation extends com.mycompany.installer.implementation.ConfigurationReader {}
    public abstract String getLoaderVirtualClassPath();
    public static QueryServiceConfigurationReader getInstance() {
        return new Implementation();
    }
}
这样,只需指定一次长名称,就可以拥有任意多个特殊命名的类


关于此模式,我喜欢的另一件事是,您可以将实现类命名为与抽象基类相同的名称,并将其放置在不同的名称空间中。这与导入/重命名模式无关。

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


如果您感兴趣,可以在这里找到JEP草案:

很可笑,java还没有这个。斯卡拉有

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

val Formatter textFormatter;
val JsonFormatter jsonFormatter;


这是正确的答案,对此我只想补充一下你的暗示:不,Java中没有这种别名语法。这在Java 8中仍然是一个限制吗?@Hairofdog Nope,不幸的是,Java8中没有添加导入别名是的,我同意你的评论linuxdan。。。Java在语法更新方面已经走上了恐龙的道路。@Bozho就像python那样:
将[完全限定名]导入为[ident]
。“as”关键字似乎也不适合Java,另一种方法是C#使用的:
import[ident]=[fully-qualified name]
。我希望Java能做到这一点。导致类具有笨拙的名称。@fncomp:…以及包含大量完全限定类名的凌乱代码:PJava 12仍然没有这一功能。这是一个非常糟糕的解决方案。它完全无法处理静态,可能需要不断更新,并且无助于反序列化问题(例如通过jaxb从xml反序列化)。在Scala中,它是:
import com.example.{Calendar=>MyCalendar}
在Kotlin中:
将com.example.Calendar导入为MyCalendar
。在PHP中,它是:使用com\example\Calendar作为MyCalendar。看到(至少)3种基于JVM的语言(Groovy、Scala和Kotlin)具有此功能非常恼人,但Java本身仍然没有……像
类MyCalendar扩展com.example.Calendar这样的东西呢{}
?它既不理想也不漂亮,但它应该能满足大多数目的,比如说反射。如果需要,你甚至可以在它前面加上注释,比如
/*导入com.example.Calendar作为MyCalendar*/
。哇!你不是在开玩笑说“不(…)”,我看到功能请求早在1998年就被视为毫无意义的甜点而被驳回了!在过去18年中,每次试图重新开启讨论的尝试都停留在对这一古老决定的引用上。我想说服IDE开发人员将其作为编辑器中的一个面具来实现要比试图将其灌输给Oracle更容易然而,旧的推理是正确的——在实践中,这些冲突很少发生。我不同意这些冲突很少发生。面向对象支持简单的命名。我可以让一个来自两个不同库的类雇员与一个雇员做不同的事(例如)。@slim“在实践中,这些冲突很少发生”。我不清楚为什么这些情况在java(您可以有10.000多个类)中发生的频率比在其他支持这种“糖”的语言(您通常有较少的类)中发生的频率要低语法。绝对不正确。我面临的是一个非常简单的场景,可能非常常见,这种语法糖将非常有用。相关但不同的对象模型之间的转换(分别用于相关但不同的产品)大多数情况下,它们的类都使用相同的名称。翻译过程要求您在同一代码块中引用这两个类。在这种情况下(这一定很常见),Java让生活变得非常困难。仅此帖子上的视图数量就应该告诉您这一情况。
import com.text.Formatter
import com.json.{Formatter => JsonFormatter}

val Formatter textFormatter;
val JsonFormatter jsonFormatter;