爲什麼下面的代碼不能編譯?通用類中的編譯錯誤
class aa1 <String> {
public void fun(){
String s = ""; // not compiling
}
}
class aa2 <String> {
String s = ""; // not compiling
}
class aa3 <String> {
String s = (String)""; // compiling
}
可以告訴或給我這個 鏈接謝謝。
爲什麼下面的代碼不能編譯?通用類中的編譯錯誤
class aa1 <String> {
public void fun(){
String s = ""; // not compiling
}
}
class aa2 <String> {
String s = ""; // not compiling
}
class aa3 <String> {
String s = (String)""; // compiling
}
可以告訴或給我這個 鏈接謝謝。
在這種情況下,泛型參數「String」隱藏了java.lang.String。
如果您聲明字符串s並指定其數據類型爲「java.lang.String」,那麼編譯器不會抱怨。
public class aa<String> {
java.lang.String s = "" ;
}
好吧,你的通用參數名稱(String
)隱藏了java.lang.String
類型。
我會推薦重命名你的通用參數。順便說一下,您希望s
的類型是:java.lang.String
還是與參數相同?在後一種情況下,編譯器如何將類型""
(其類型爲java.lang.String
)分配給由泛型參數表示的潛在不相關類型?
在您的示例中,您聲明String
作爲標識符。您不得使用關鍵字或類型名稱。 (Generics Tutorial)。
但它是在第三課中鑄造編譯? – user460293 2011-12-26 12:36:31
@ user460293 - 它會在警告下編譯。閱讀該警告,你會得到正確的答案。 – adatapost 2011-12-26 12:39:32
我想你可能誤解了泛型背後的想法。關鍵是你的班級(在這種情況下,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。
既然你聲明的泛型類型String
,這將覆蓋默認java.lang.String
類型,你的代碼是一樣的打字:
class aa<T> {
T s = "";
}
T
簡直是Object
類型擦除後,但因爲它可以初始化與任何東西(例如Integer
),編譯器不會讓你指定String
到它。
你的代碼沒有意義 - 聲明沒有任何意義 - 你真的想在這裏做什麼?
你有編譯問題的原因是你正在做一個隱藏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
}
是不是編譯器錯誤消息你得到一些提示? – 2011-12-26 12:29:01