Я читал интервью с Джошуа Блохом в "Coders at Work", где он жаловался на введение дженериков на Java 5. Ему не нравится конкретная реализация в значительной степени из-за того, что поддержка дисперсии - подстановочные символы Java - делает ее излишне сложной.
Насколько я знаю, С# 3 не имеет ничего похожего на явные ограниченные подстановочные знаки, например. вы не можете объявить метод PriceBatch, который принимает коллекцию Asset или любого подкласса Asset (void PriceBatch(Collection<? extends Asset> assets)
в Java?).
Кто-нибудь знает, почему подстановочные знаки и ограничения не были добавлены в С#? Были ли эти функции умышленно упущены, чтобы сделать язык более простым, или это то, чего они еще не успели реализовать?
EDIT: Священный дым, комментарии самого Эрика Липперта! После прочтения его проницательных замечаний и Пол я понимаю, что поддерживаются, по крайней мере, верхние границы и что приведенный выше пример можно перевести на С# следующим образом:
void PriceBatch<T>(ICollection<T> assets) where T : Asset
Нижние границы, с другой стороны, по-видимому, не поддерживаются, как говорит Эрик в своем втором комментарии, например. вероятно, нет способа напрямую перевести этот (несколько надуманный) Java-код на С#:
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);
Правильно ли я? Если это так, есть ли особая причина, почему С# имеет верхние, но не нижние границы?