簡體   English   中英

Java泛型查詢(上界通配符)

[英]Java generics query (Upper Bounded Wildcards)

考慮以下情況,FastCar類從Car類擴展:

public class FastCar extends Car {}

主要方法中的代碼段:

Set<? extends Car> mySet6 = null;
mySet6.add(new FastCar()); //<-----compile error  

編譯錯誤詳細信息:

(The method add(capture#4-of ? extends Car) in the type Set<capture#4-of ? 
extends Car> is not applicable for )

我很困惑,為什么FastCar對象不能放入“對象集Car擴展”中,任何人都可以幫助澄清? 謝謝。

泛型的目的是提供類型安全的操作(並禁止非類型安全的操作)。

對於Set<? extends Car>類型的變量 Set<? extends Car>編譯器允許分配類型為Set<SlowCar>的值,因為Set<SlowCar>擴展Set<? extends Car> Set<? extends Car> 如果這樣做,將FastCar添加到只允許SlowCarSet顯然是錯誤的。 因此,將FastCar添加到Set可以? extends Car ? extends Car也必須不允許,因為它不是類型安全的。

Set<SlowCar> slowSet = ...;

slowSet.add(new FastCar()); // Obviously ERROR, FastCar does not extend SlowCar

Set<? extends Car> carSet = slowSet; // Allowed, valid (SlowCar extends Car)

carSet.add(new FastCar());   // Error, because carSet might be
                             // and actually is a set of SlowCars

在您的情況下,應使用Set<Car>

Set<Car> cars = ...;

cars.add(new FastCar());   // Valid, FastCar extends Car
cars.add(new SlowCar());   // Valid, SlowCar extends Car

Java教程中有關通配符的情況很好地解釋了這種情況。 我將重新編寫它(我將類型和對象名稱重命名):

您應該能夠弄清楚為什么不允許使用上面的代碼。 mySet6.add()的參數類型為? extends Car ? extends Car -未知亞型Car 由於我們不知道它是什么類型,所以我們不知道它是否是FastCar的超類型; 它可能是也可能不是這種超類型,因此在FastCar傳遞FastCarFastCar

http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

暫無
暫無

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

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