2011-04-24 75 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);} 
    } 

} 
相關問題