簡體   English   中英

下限的通配符

[英]Lower bounded wildcard

我一直在努力理解Java Generics中下限通配符背后的概念和基本原理。 我可以理解上邊界通配符背后的推理,以及它在何處以及如何使用。 我仍然無法掌握下限的通配符。 我有一組遵循以下層次結構的類。 Automobile是基類。)

Automobile
    - Bus
        - Minibus
        - Doubledecker
        - Electricbus
    - Car
        - Sedan
        - Hatchback
        - Coupe
    - Truck
        - Minivan
        - Pickuptruck
        - Suv
            - Fullsuv
            - Midsuv

現在我正在嘗試構建一個(靈活的)列表並向其添加不同類型的對象。

import java.util.ArrayList;
import java.util.List;

public class Garage {

    public static void main(String[] args)
    {
        List<? super Suv> list = null;

        Suv s = new Suv();
        Truck t = new Truck();
        Automobile a = new Automobile();

        list = new ArrayList<Suv>();
        list.add(s); // declared as List<? super Suv> but actually List<Suv>. No compilation error

        list = new ArrayList<Truck>();
        list.add(t); // declared as List<? super Suv> but actually List<Truck>. Compilation error

        list = new ArrayList<Automobile>();
        list.add(a); // declared as List<? super Suv> but actually List<Automobile>. Compilation error
    }
}

我能夠將一個Suv實例添加到List<? super Suv> List<? super Suv> 但是當我嘗試將TruckAutomobile實例添加到同一列表時,我收到編譯錯誤。 不是List<? super Suv> List<? super Suv>足夠靈活,可以采取Suv或其超級類的任何實例? TruckAutomobile在層次結構樹中更高。 為什么我無法將這些實例添加到列表中?

List<? super Suv> List<? super Suv>應該被理解為“一個元素類型是Suv超類型的列表”

現在,讓我們看看這兩行:

list = new ArrayList<Automobile>();
list.add(a); // where a is an Automobile

第一行是好的,因為ArrayList<Automobile>確實是“一個元素類型是Suv超類型的列表”

但是讓我們讀出第二行:將一些Automobile添加到一個列表,其元素類型是超級類型的Suv

就編譯器從靜態類型中所知,

  • list可以引用List<Truck> (因為Truck是超級類型的Suv )和
  • t可以指Car (因為CarAutomobile

因此,編譯器會抱怨確保您沒有將Car添加到Trucks列表中。


有用的閱讀:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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