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


363

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

from a import b as c

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


19
我希望java做到这一点。导致带有尴尬名称的类。
fncomp

2
@fncomp:..和具有很多完全合格的类名的凌乱代码:P
Superole 2016年

2
Java 12仍然没有此功能
Janac Meena

Answers:


463

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

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

import com.text.Formatter;

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

16
答案是正确的,我只想添加您所暗示的内容:不,Java中没有这样的别名语法。
肖恩·欧文

19
这仍然是Java 8中的限制吗?
HairOfTheDog

8
@HairOfTheDog Nope,很遗憾,Java8中未添加任何导入别名
AdrieanKhisbe 2014年

12
是的,我同意您的评论linuxdan ... Java在更新其语法方面已走出了恐龙的道路。
凯文·帕克

6
@Bozho方式Python做:import [fully-qualified-name] as [ident]。“ as”关键字似乎也不适用于Java,替代方法大约是C#所使用的:import [ident] = [fully-qualified-name]
丹尼尔H

60

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

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

从评论:

这不是一个不合理的请求,尽管不是很必要。偶尔使用完全限定的名称并不是一个不适当的负担(除非库确实左右重复使用相同的简单名称,这是不好的样式)。

无论如何,它不会超过语言更改的性价比。

所以我想我们很快将不会在Java中看到此功能:-P


15
哇!您并不是在开玩笑“很快就不会(...)”,我发现该功能请求早在1998年就被当作毫无意义的糖而被驳回!在过去的18年中,每次重新讨论的尝试都停留在提及那个古老的决定上。我猜想说服IDE开发人员在编辑器中将其实现为掩码比将其引入Oracle更容易。
Superole

2
不过,旧的推理是正确的-实际上,这些冲突很少发生。
2016年

14
我不同意这些冲突很少发生。面向对象支持简单的命名。我可以从两个不同的库中创建一个Employee类,例如,与一个雇员做单独的事情。
Andrei Epure

6
@slim“ 实际上很少发生这些冲突 ”。为什么这些情况将不经常在java中比在其他语言(如你通常有较少的班级)发生(在那里你可以有10.000+类),这不是很清楚,我支持这种“糖”的语法。
阿兰·潘尼捷

21
绝对不正确。我面对的是一个非常简单的场景,该场景可能很常见,而这种语法糖将非常有帮助。相关但截然不同的对象模型(分别用于相关但不同的产品)之间的转换,这些对象模型大多数时候都使用相同的名称。转换过程要求您在同一代码块中引用这两个类。在这种情况下(一定很常见),Java使生活变得非常困难。只是这篇文章的观点数量应该可以告诉您这个故事。
hrshi1990 '17

59

值得注意的是Groovy具有此功能

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

MyCalendar myCalendar = new MyCalendar()

15
在Scala中,它是:import com.example.{Calendar => MyCalendar}
pablisco '16

24
而在科特林:import com.example.Calendar as MyCalendar
KevinO

14
在PHP中,它是:使用com \ example \ Calendar作为MyCalendar
matang

19
令人十分恼火的是,(至少)3种基于JVM的语言(Groovy,Scala和Kotlin)具有此功能,但Java本身仍然没有...
Matthias

2
怎么样class MyCalendar extends com.example.Calendar {}呢?它不是理想的或漂亮的,但它应满足大多数目的,例如反射。如有必要,您甚至可以在注释前加上/* import com.example.Calendar as MyCalendar */
Braden Best

21

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



-4

实际上,可以创建一个快捷方式,以便通过执行以下操作在代码中使用较短的名称:

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();
    }
}

这样,您只需要指定一次长名称,就可以拥有多个想要的特殊命名的类。

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


18
这是一个非常差的解决方案。它完全无法处理静态信息,可能需要不断更新,并且无法解决反序列化问题(例如从xml到jaxb的反序列化)。
软件工程师
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.