2011-04-24 50 views
37

有没有办法,我们可以导入另一个名字的类? 就像我有一个名为javax.C的类和另一个名为java.C的类,我可以在名称C1下导入javax.C,并在名称C2下导入java.Classes。java,有没有办法,我们可以导入另一个名字的类

我们可以做这样的事情在C#:

using Sys=System; 

或VB:

Imports Sys=System 
+0

您可以在Scala中做到这一点是这样的:。 进口java.util中ArrayList的{=> JavaList} – bartektartanus 2016-12-31 15:22:31

回答

41

没有,有没有像在Java中。您只能以其原始名称导入类,并且必须使用您不导入的所有名称的完全限定名(java.lang和当前类的包中除外)。

4

简而言之,不,这在Java中是不可能的。

2

编号我认为Java 故意开沟typedef。好消息是,如果你看到一种类型,你就知道它是什么。它不能成为别的别名;或别名到别名...

如果一个新的概念真的值得一个新的名字,它最有可能值得一个新的类型也。

Sys=System的使用示例将被大多数Java开发人员所诟病。

+7

实际上,这只是一个例如,一个更好的用例就是导入带有冲突名称的类(这会一直发生) – Pacerier 2011-04-24 01:02:10

+1

@Pacerier名称冲突在java中并不常见,当它发生时,使用包名称的完整类名,其pu rpose是专门解决名称冲突的。 – irreputable 2011-04-24 01:11:35

+5

我不相信包的目的是专门解决名称冲突。包是用于逻辑分组的。名称冲突在OOP中是“预期的”,这就是为什么我们有包/名称空间 – Pacerier 2011-04-24 01:51:27

4

你不能在所有的情况下做到这一点,因为有些是final类,但你可以扩展该类

class RenameTest { 

    private static class MyRenamedClass extends ClassToRename { } 


    MyRenamedClass renamed = new ClassToRename("lol, the class was renamed"); 

    void foo() { 
     renamed.originalFoo(); // because MyRenamedClass doesn't override any 
           // methods, it always defaults to the parent class 
    } 
} 
+13

我想说清楚,我真的不觉得这是一件好事理念。只是说这是可能的。 – corsiKa 2011-04-24 01:07:48

+10

+1为“哈哈,班级更名为” – Pacerier 2011-04-24 01:54:03

+0

不是一回事。例如,如果'RenameTest'使用MyRenamedClass'类型的参数创建一个公共方法,并且另一个类尝试使用'ClassToRename'的实例调用该方法,则结果将是编译错误。也无法访问ClassToRename的* static * s。但是你并没有说这是个好主意,只是增加更多的证据证明它不是。 – ToolmakerSteve 2015-06-24 20:52:41

0

Java不支持静态重命名。其中一个想法是用新的类名称来描述有问题的对象(但由于某些副作用/限制,可能不是一个好主意,例如,你的目标类可能有最终的修饰语。如果允许的话,如果明确的类型检查使用getClass()或等(例如低于改编自一个不同的答案)

class MyApp { 

    public static void main(String[] args) { 
    ClassToRename parent_obj = new ClassToRename("Original class"); 
    MyRenamedClass extended_obj_class_renamed = new MyRenamedClass("lol, the class was renamed"); 
    // these two calls may be treated as the same 
    // * under certain conditions only * 
    parent_obj.originalFoo(); 
    extended_obj_class_renamed.originalFoo(); 
    } 

    private static class ClassToRename { 
    public ClassToRename(String strvar) {/*...*/} 
    public void originalFoo() {/*...*/} 
    } 

    private static class MyRenamedClass extends ClassToRename { 
    public MyRenamedClass(String strvar) {super(strvar);} 
    } 

} 
相关问题