2014-09-27 63 views
1

我看到的代碼塊: 什麼問號問號是什麼? (不與Java的:)使用的手段

public abstract List<Class<? extends Pet>> types(); 

(之前這表明,類狗和貓是從類繼承寵物)?是指在這裏?

+1

http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html – Pshemo 2014-09-27 04:21:01

回答

3

這被稱爲通配符,在定義泛型時很有用。看看從documentation這個例子:

Collection<?> c = new ArrayList<String>(); 
c.add(new Object()); // Compile time error 

因爲我們不知道C的元素類型代表,我們不能將對象添加到它。 add()方法使用類型E的參數,集合的元素類型。當實際的類型參數是?時,它代表某種未知的類型。我們通過添加的任何參數都必須是此未知類型的子類型。由於我們不知道什麼類型,我們不能傳入任何東西。唯一的例外是null,它是每種類型的成員。

而且從偉大Java泛型FAQ

的通配符描述了家庭的類型。有3種不同的通配符口味:

  • - 無界通配符 「?」。它代表所有類型的家庭。
  • 「?extends Type」 - 帶有上限的通配符。它代表所有Type的子類型的所有類型,包括Type類型。
  • 「?super Type」 - 帶有下限的通配符。它代表所有類型的超類型的家族,包括類型類型。

通配符用於聲明所謂通配符參數化類型,其中一個通配符被用作通用類型的實例化參數。通配符在沒有或只需要關於參數化類型的類型參數部分知識的情況下很有用。

0

?是一張通配符,暗示「任何事物」。在這個例子中,它意味着擴展Pet的所有類的列表。可能是狗或貓或任何動物是寵物