我正在阅读Codehua at Work中对Joshua Bloch的采访,他在Java 5中对泛型的介绍感到遗憾.他不喜欢具体的实现,主要是因为方差支持--Java的通配符 - 使得它不必要地复杂化.
据我所知,C#3没有像明确的,有界的通配符那样的东西,例如你不能声明一个接收Asset或任何Asset子类(void PriceBatch(Collection<? extends Asset> assets)在Java中?)的方法PriceBatch .
有谁知道为什么没有将通配符和边界添加到C#中?故意遗漏这些功能以使语言更简单,或者这是他们还没有实现的东西呢?
编辑:圣烟,Eric Lippert本人的评论!在阅读了他和Paul的深刻见解之后,我意识到至少支持上限,并且上面的例子可以转换为C#:
void PriceBatch<T>(ICollection<T> assets) where T : Asset
Run Code Online (Sandbox Code Playgroud)
另一方面,显然不支持下限,因为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);
Run Code Online (Sandbox Code Playgroud)
我对么?如果是这种情况,C#有上限而不是下限的特殊原因是什么?