簡體   English   中英

什么使泛型類型參數的名稱成為泛型?

[英]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());
    }
}

這工作得很好,因為在ExampleFoo是一個類型參數,而不是類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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM