簡體   English   中英

Java Generics - 原始類型與非泛型類型有何不同

[英]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.

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