2011-12-26 67 views
1

爲什麼下面的代碼不能編譯?通用類中的編譯錯誤

class aa1 <String> { 
public void fun(){ 
String s = ""; // not compiling 
} 
} 
class aa2 <String> { 
String s = ""; // not compiling 
} 
class aa3 <String> { 
String s = (String)""; // compiling 
} 

可以告訴或給我這個 鏈接謝謝。

+1

是不是編譯器錯誤消息你得到一些提示? – 2011-12-26 12:29:01

回答

2

在這種情況下,泛型參數「String」隱藏了java.lang.String。

如果您聲明字符串s並指定其數據類型爲「java.lang.String」,那麼編譯器不會抱怨。

public class aa<String> { 

    java.lang.String s = "" ; 

} 
0

好吧,你的通用參數名稱(String)隱藏了java.lang.String類型。

我會推薦重命名你的通用參數。順便說一下,您希望s的類型是:java.lang.String還是與參數相同?在後一種情況下,編譯器如何將類型""(其類型爲java.lang.String)分配給由泛型參數表示的潛在不相關類型?

0

在您的示例中,您聲明String作爲標識符。您不得使用關鍵字或類型名稱。 (Generics Tutorial)。

+0

但它是在第三課中鑄造編譯? – user460293 2011-12-26 12:36:31

+0

@ user460293 - 它會在警告下編譯。閱讀該警告,你會得到正確的答案。 – adatapost 2011-12-26 12:39:32

6

我想你可能誤解了泛型背後的想法。關鍵是你的班級(在這種情況下,aa)可以......很好,通用。它不是一種固定類型,而是可以是多態的任意數量的類型。泛型類型與變量名相似,但它代表一個類,而不是一個類的實例。你可以這樣做:

class aa <T> { 
    public void fun(T myObject){ 
     T s = myObject; 
    } 
} 

這是一個適當的泛型使用。 T只是代表「某個班級」。 您發佈的示例沒有編譯的原因是因爲您覆蓋了字符串(使其成爲泛型類型而不是java.lang.String)的可見性。如果你不希望它是任何類,但類的某個子集,你可以這樣做:

class aa <T extends MyInterface> { 
    public void fun(T myObject){ 
     T s = myObject; 
    } 
} 

在這種情況下,你保證T類的實例也擴展接口MyInterface。但是,您不能延長String,因爲它是最終的。如果你想一切都爲String對象設置,你就根本不需要泛型:

class aa { 
    public void fun(){ 
     String s = ""; 
    } 
} 

有關泛型的更多信息,請閱讀過the Java tutorials on generics

0

既然你聲明的泛型類型String,這將覆蓋默認java.lang.String類型,你的代碼是一樣的打字:

class aa<T> { 
    T s = ""; 
} 

T簡直是Object類型擦除後,但因爲它可以初始化與任何東西(例如Integer),編譯器不會讓你指定String到它。

1

你的代碼沒有意義 - 聲明沒有任何意義 - 你真的想在這裏做什麼?

你有編譯問題的原因是你正在做一個隱藏JDK的java.lang.String的泛型聲明。

你也宣佈同一班3次。像這樣的東西可以編譯,但仍可能無法達到你想要的。

class aa<NotString> { 
    public void fun() { 
     String s = ""; // compiles 
    } 
} 

class aa2<NotString> { 
    String s = ""; // compiles 
} 

class aa3<NotString> { 
    String s = (String) ""; // compiling 
}