聲明是這樣的:爲什麼Wild Card不能用於泛型類和方法聲明?
class A<X extends Number & List> { }
是這樣allowed.Whereas聲明是不允許的。
class A<? extends Number & List> { }
是否有關於爲什麼Java的限制我們做任何合理的解釋?
&什麼
<T extends Number>
& <? extends Number>?
聲明是這樣的:爲什麼Wild Card不能用於泛型類和方法聲明?
class A<X extends Number & List> { }
是這樣allowed.Whereas聲明是不允許的。
class A<? extends Number & List> { }
是否有關於爲什麼Java的限制我們做任何合理的解釋?
&什麼
<T extends Number>
& <? extends Number>?
像T
類型參數的整點是讓你可以將它用作課堂內的類型。那裏的通配符甚至意味着什麼?如果你不能在任何地方使用它,爲什麼有一個類型參數呢?
之間的實際差異如果使用<? extends Number & List>
,那麼你就無法做與任何類型的參數。它完全沒用。
同樣,? extends Number
可以讓你處理特殊情況,當你不需要引用擴展數字的類型,而且你不需要給它一個名字。
泛型類和接口聲明需要類型參數,如T或U.是通配符,更好用於本身是通用的方法參數:
class Foo<T extends Number & List> {
void doStuff(List<T> items) {
// ...
}
void doMoreStuff(List<? extends OutputStream> streams) {
// ...
}
}
doStuff()表示它想在一個List<T>
操作,其中T是在類Foo類型參數。所以:
class Weird extends Number implements List {
//
}
Foo<Weird> f = new Foo<Weird>();
f.doStuff(...); // wants a List<Weird>
如果我們稱爲F上doMoreStuff(),我們可以把它List<OutputStream>
類型,List<FilterOutputStream>
,List<ByteArrayOutputStream>
的東西,等
難道你不應該在Foo上調用'doStuff()'而不奇怪嗎? – 2012-03-28 19:54:57
糟糕。編輯... – pholser 2012-03-28 20:45:53
你確實有一個擴展'Number'並實現'List'的類嗎?或者它擴展'Number'並實現'List''?或X擴展'Number'並實現'List '?如果沒有在某個地方聲明'X'類型,你會怎麼寫最後一個呢? –
2012-03-28 19:37:39
好點 - 「數字」和「列表」並不是真正的類型,你期望像這樣共存。 – 2012-03-28 19:39:39
@LouisWasserman:即使他們這樣共存,我只是指出你可能需要泛型定義來指定你的列表所持有的。無論如何,避免原始類型可能會更好。 – 2012-03-28 19:48:14