声明是这样的:为什么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