Tôi đã đọc một cuộc phỏng vấn với Joshua Bloch trong Coders at Work, nơi ông than thở việc giới thiệu Generics trong Java 5. Ông không thích việc thực hiện cụ thể phần lớn bởi vì sự hỗ trợ phương sai - các ký tự đại diện của Java — làm cho nó phức tạp một cách không cần thiết.C# generics - không có giới hạn dưới bởi thiết kế?
Theo như tôi biết, C# 3 không có bất kỳ thứ gì như ký tự đại diện rõ ràng, bị chặn, ví dụ: bạn không thể khai báo một phương thức PriceBatch lấy một bộ sưu tập Asset hoặc bất kỳ phân lớp Asset nào (void PriceBatch(Collection<? extends Asset> assets)
trong Java?).
Có ai biết tại sao ký tự đại diện và giới hạn chưa được thêm vào C#? Những tính năng này có được bỏ qua một cách có chủ ý để làm cho ngôn ngữ trở nên đơn giản hơn hay đây là thứ mà họ chưa thực hiện để thực hiện?
EDIT: Hút thuốc lá, nhận xét từ Eric Lippert! Sau khi đọc ý kiến sâu sắc của Paul của mình và, tôi nhận ra rằng ít nhất cận trên được hỗ trợ và rằng ví dụ trên có thể được dịch sang C# như:
void PriceBatch<T>(ICollection<T> assets) where T : Asset
giới hạn thấp hơn, mặt khác, được dường như không được hỗ trợ như Eric nói trong bình luận thứ hai của mình, ví dụ có thể không có cách nào để dịch trực tiếp mã Java này (phần nào được giả tạo) sang 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);
Tôi có đúng không? Nếu đây là trường hợp, có một lý do cụ thể tại sao C# có giới hạn trên nhưng không thấp hơn?
Tôi không hiểu câu hỏi; C# đã giới hạn generics và có kể từ C# 2. Là những gì bạn đang nhận được ở đó Java hỗ trợ * call-site * hiệp phương sai và contravariance trên các loại chung được xây dựng? Bởi vì C# không hỗ trợ điều đó; C# 4 sẽ hỗ trợ phương thức * declaration-site *. –
Hoặc là những gì bạn đang nhận được ở thực tế là loại tham số giới hạn trên các phương pháp chung chỉ là bắt nguồn từ giới hạn, và không phải là bắt nguồn từ giới hạn? C# không hỗ trợ cái sau; Tôi tin rằng Java và Scala. –
Cảm ơn, tôi đã cập nhật câu hỏi. – ehnmark