[英]What makes a name of a generic type parameter, generic?
我正在為自己寫一本 java 手冊,我喜歡把可靠的事實放進去。我似乎無法描述泛型類型參數。 我想知道什么名稱顯示為編譯器的泛型類型而不是現有對象。 我知道約定是字母“T”和其他單個字母。 但我在 oracle.docs.com 中看到了一個例子:
class name<T1, T2, ..., Tn>{}
所以現在我很困惑。 對於編譯器將名稱作為泛型類型參數,是否必須只有沒有具有該名稱的現有類? 如果我有一個班博比:
class Boby{ ... }
然后,如果我創建一個方法並將類的名稱錯誤輸入給 Bob:
void Method(Bob parameter){}
這只是編譯並且參數會成為泛型類型嗎?
任何名稱都可以是泛型類型參數。 如果聲明泛型類型參數Bob
並使用該名稱而不是預期的類名Boby
,編譯器會將其識別為泛型類型參數。
順便說一句,如果您聲明一個泛型類型參數Boby
,它將隱藏類名Boby
,因此在定義泛型類型參數的范圍內的任何地方(在整個類中或在單個方法中)編寫Boby
將引用泛型類型參數,而不是Boby
類。
class Something<Bob> {
void Method1(Bob parameter){} // refers to the generic type parameter Bob
void Method2(Boby parameter){} // refers to the Boby class
}
class Something<Boby> {
void Method(Boby parameter){} // refers to the generic type parameter Boby,
// hiding the Boby class
}
class Something<T> {
void Method(Bob parameter){} // compilation error - Bob is an undefined symbol
}
也就是說,為了使您的代碼更具可讀性,最好使用單個大寫字母作為類型參數名稱。
在類上聲明的類型參數會影響任何實際類,就像本地類一樣:
interface HasValue {
int getValue();
}
class Foo {
}
class Bar implements HasValue {
private int value;
public Bar(int v) {
this.value = v;
}
public int getValue() {
return this.value;
}
}
class Example<Foo extends HasValue> {
public static final void main(String[] args) throws Exception {
Example<Bar> e = new Example<>();
e.method(new Bar(42));
}
public void method(Foo x) {
System.out.println("x.getValue() is " + x.getValue());
}
}
這工作得很好,因為在Example
, Foo
是一個類型參數,而不是類Foo
。
為了讓編譯器知道一個類是否用作泛型,您需要像這樣指定它:
public class MyClass<T> {}
例如,如果您為列表創建泛型,讓我們假設以下內容:
List<Bob> bobyes = new ArrayList<Bob>();
所以現在你有一個泛型列表,包含 Bob 類型類的元素。 列表中每個元素的所有類型都是 Bob。
如果您遍歷它,您將擁有:
foreach (Bob bob : bobyes)
if (bob instanceof Bob)
true; -- in this case always true;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.