我正在阅读 Coders at Work 中对 Joshua Bloch 的采访,他对 Java 5 中泛型的引入感到遗憾。他不喜欢具体的实现,主要是因为对差异的支持——Java 的通配符——使它变得不必要地复杂。
据我所知,C# 3 没有任何明确的、有界通配符,例如,您不能声明一个方法 PriceBatch 采用 Asset 集合或任何 Asset 子类(void PriceBatch(Collection<? extends Asset> assets)
在 Java 中?)。
有谁知道为什么没有将通配符和边界添加到 C# 中?这些特性是为了让语言更简单而故意遗漏的,还是他们还没有实现?
编辑:神圣的烟雾,来自 Eric Lippert 本人的评论!在阅读了他和 Paul 富有洞察力的评论后,我意识到至少支持上限,并且上面的示例可以转换为 C#:
void PriceBatch<T>(ICollection<T> assets) where T : Asset
另一方面,正如 Eric 在他的第二条评论中所说,显然不支持下限,例如,可能没有办法将这个(有点做作的)Java 代码直接翻译成 C#:
public class Asset {}
public class Derivative extends Asset {}
public class VanillaOption extends Derivative {}
public static <T extends Asset> void copyAssets(Collection<T> src, Collection<? super T> dst) {
for(T asset : src) dst.add(asset);
}
Collection<VanillaOption> src = new ArrayList<VanillaOption>();
[...]
Collection<Derivative> dst = new ArrayList<Derivative>();
[...]
copyAssets(src, dst);
我对么?如果是这种情况,C# 有上限但没有下限是否有特殊原因?