2012-03-28 49 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

相关问题