[英]Java Generics - How is a raw type different from a non generic type
在java泛型上下文中,原始類型是泛型類型的非參數化調用。 他們還說任何非泛型類型都不是原始類型。
我的困惑是,為什么他們說非泛型類型不是原始類型? 它與泛型類型的非參數化調用有何不同? 考慮以下2個案例。
情況1:
class A<T>{
}
A a = new A(); //Raw type
案例2:
class A{
}
A a = new A();//Non-generic type
如果變量“a”在兩種情況下表現相同,為什么他們說case [1]是原始類型而case [2]不是?
原始類型的概念僅與泛型類型相關,因為原始類型被認為是與泛型類型的賦值兼容的問題,但是這樣的賦值打開了類型安全的漏洞,否則保證泛型類型。 例如,考慮一個方法void workWith(A<Integer> a)
。 您將被允許傳入您a
變量,從而導致類型安全事件。
由於非泛型類型不會受到這些問題的影響,因此它們不被稱為“原始類型”。
如JLS
所述:
非泛型類或接口類型不是原始類型。
你可以感受到句法 層面的差異:
如果我們有參數化類:
class A<X> {
class B<Y> {
Y y;
}
}
然后只是A
名稱類型或B
名稱類型不是non-generic
類型,它們是raw
的類型,以及如何訪問它們此影響:
所有這些結構都會導致編譯時錯誤:
A<Integer>.B ab = null;
A.B<Integer> ab = null;
原始類型與泛型類型和類型擦除的邊界有關。 如果你有ArrayList<? extends Shape>
ArrayList<? extends Shape>
然后綁定類型是Shape,並且在編譯時將是原始類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.