2012-03-28 22 views
0

聲明是這樣的:爲什麼Wild Card不能用於泛型類和方法聲明?

class A<X extends Number & List> { } 

是這樣allowed.Whereas聲明是不允許的。

class A<? extends Number & List> { } 

是否有關於爲什麼Java的限制我們做任何合理的解釋?

&什麼

 <T extends Number> 
    & <? extends Number>? 
+1

你確實有一個擴展'Number'並實現'List'的類嗎?或者它擴展'Number'並實現'List ''?或X擴展'Number'並實現'List '?如果沒有在某個地方聲明'X'類型,你會怎麼寫最後一個呢? – 2012-03-28 19:37:39

+0

好點 - 「數字」和「列表」並不是真正的類型,你期望像這樣共存。 – 2012-03-28 19:39:39

+0

@LouisWasserman:即使他們這樣共存,我只是指出你可能需要泛型定義來指定你的列表所持有的。無論如何,避免原始類型可能會更好。 – 2012-03-28 19:48:14

回答

1

T類型參數的整點是讓你可以將它用作課堂內的類型。那裏的通配符甚至意味着什麼?如果你不能在任何地方使用它,爲什麼有一個類型參數呢?

3

之間的實際差異如果使用<? extends Number & List>,那麼你就無法與任何類型的參數。它完全沒用。

同樣,? extends Number可以讓你處理特殊情況,當你不需要引用擴展數字的類型,而且你不需要給它一個名字。

0

泛型類和接口聲明需要類型參數,如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>的東西,等

+0

難道你不應該在Foo上調用'doStuff()'而不奇怪嗎? – 2012-03-28 19:54:57

+0

糟糕。編輯... – pholser 2012-03-28 20:45:53