Có sự khác biệt nào giữa Enumeration <? mở rộng ZipEntry > và liệt kê <ZipEntry>? Nếu vậy, sự khác biệt là gì?Sự khác biệt giữa liệt kê <? mở rộng ZipEntry> và Enumeration <ZipEntry>?
Trả lời
Không có sự khác biệt thực tế về những gì bạn có thể làm khi bạn có một trong số chúng, vì thông số loại chỉ được sử dụng ở vị trí "đầu ra". Mặt khác, có một sự khác biệt lớn về những gì bạn có thể sử dụng là một trong số đó.
Giả sử bạn có một số Enumeration<JarEntry>
- bạn không thể chuyển điều này đến phương thức lấy Enumeration<ZipEntry>
làm một trong các đối số của nó. Tuy nhiên, bạn có thể chuyển nó sang phương thức lấy Enumeration<? extends ZipEntry>
.
Điều thú vị hơn khi bạn có loại sử dụng thông số loại ở cả vị trí đầu vào và đầu ra - List<T>
là ví dụ rõ ràng nhất. Dưới đây là ba ví dụ về các phương pháp có các biến thể trên một tham số. Trong mỗi trường hợp, chúng tôi sẽ cố gắng lấy một mục từ danh sách và thêm một mục khác.
// Very strict - only a genuine List<T> will do
public void Foo(List<T> list)
{
T element = list.get(0); // Valid
list.add(element); // Valid
}
// Lax in one way: allows any List that's a List of a type
// derived from T.
public void Foo(List<? extends T> list)
{
T element = list.get(0); // Valid
// Invalid - this could be a list of a different type.
// We don't want to add an Object to a List<String>
list.add(element);
}
// Lax in the other way: allows any List that's a List of a type
// upwards in T's inheritance hierarchy
public void Foo(List<? super T> list)
{
// Invalid - we could be asking a List<Object> for a String.
T element = list.get(0);
// Valid (assuming we get the element from somewhere)
// the list must accept a new element of type T
list.add(element);
}
Để biết thêm chi tiết, đọc:
Vâng, trực tiếp từ một trong những sun generics tutorials:
Ở đây Hình dạng là lớp trừu tượng với ba lớp con: Hình tròn, Hình chữ nhật, và Hình tam giác.
public void draw(List<Shape> shape) { for(Shape s: shape) { s.draw(this); } }
Điều đáng chú ý là phương pháp bốc thăm() chỉ có thể được gọi vào danh sách Shape và không thể được gọi vào danh sách của Circle, Rectangle, và Triangle cho ví dụ. Để có phương pháp chấp nhận bất kỳ loại hình dạng, nó phải là viết như sau:
public void draw(List<? extends Shape> shape) { // rest of the code is the same }
Đây là lần thứ hai trong tuần này Jon Skeet đã nhận được câu trả lời ngay trước tôi. Tôi đề nghị chúng tôi đề cập đến điều này như Skeeting. – GaryF
có vẻ tốt. căng thẳng quá khứ sẽ là gì? Sket? "Jon Skeet trượt tôi đi!" :) – Epaga
http://stackoverflow.com/questions/305223/jon-skeet-facts/317486#317486 –
Bây giờ bạn vừa đi và nhắc nhở tôi về một cái gì đó tôi muốn chúng tôi đã có hơn trong C# thế giới .
Khác với các liên kết được cung cấp, có một số liên kết tốt về C# và Java liên quan đến chủ đề này trong các câu trả lời cho câu hỏi này: Logic and its application to Collections.Generic and inheritance
Một lựa chọn trong số đó là:
- Contravariance and Covariance in C# (đang là C# cụ thể và lý thuyết vì cú pháp không tồn tại [chưa], nhưng bao gồm các chủ đề nói chung rất tốt.)
- Java generics and the covariance and contravariance of arguments
- Java generics tutorial fr om Sun.
- 1. Sự khác nhau giữa <? mở rộng Object> và <E mở rộng Object>?
- 2. Cách truyền danh sách <? mở rộng Foo> để Liệt kê <Foo>
- 3. Sự khác biệt giữa Java Enumeration và Iterator
- 4. sự khác biệt giữa '! =' Và '<>' trong mysql
- 5. Sự khác nhau giữa OfType <>() và kiểm tra gõ vào đâu() mở rộng
- 6. Sự khác nhau giữa <% # và <% = thẻ mở là gì?
- 7. Java Enums: Liệt kê các giá trị được liệt kê từ một Class <? mở rộng Enum>
- 8. Sự khác biệt giữa <system.web> và <system.webServer> là gì?
- 9. trong ruby sự khác biệt giữa self.method và phương thức trong lớp << self
- 10. Sự khác biệt giữa <input type = 'button' /> và <input type = 'submit' />
- 11. Whats sự khác biệt giữa <RequiredTargetFramework> và <targetframeworkversion> là gì?
- 12. Sự khác biệt giữa Tác vụ <> và IAsyncOperation <>
- 13. Ruby - Sự khác biệt giữa mảng # << và Array # push
- 14. Sự khác biệt giữa <semaphore.h> và <sys/sem.h>
- 15. Sự khác biệt giữa <% ... %> và <%! ... %> trong jsp
- 16. Sự khác biệt giữa <asp:table> và <table>?
- 17. Java: Sự khác biệt giữa <init> và <clinit> là gì?
- 18. Có sự khác biệt giữa <winsock.h> và <winsock2.h> không?
- 19. Sự khác biệt giữa <include> và <ViewStub> trong android
- 20. Sự khác biệt giữa Danh sách <T> và Danh sách <object>?
- 21. sự khác biệt giữa <xsl: apply-template> và <xsl: call-template>?
- 22. Sự khác biệt giữa <pubDate> và <lastBuildDate> trong RSS là gì?
- 23. Sự khác biệt giữa <f:subview> và <ui: composition> thẻ
- 24. Sự khác biệt giữa Danh sách <T> và LinkedList <T>
- 25. Sự khác biệt giữa ArrayList <>() và ArrayList <>() {}
- 26. Sự khác biệt giữa <string> và <string.h>?
- 27. Có sự khác biệt giữa Count() (phần mở rộng LINQ) và Danh sách <T> .Count
- 28. Sự khác biệt giữa "**/* /" và "** /"?
- 29. Sự khác biệt giữa việc mở rộng Hoạt động và mở rộng ListActivity là gì?
- 30. Sự khác nhau giữa <%: và <% = và <% # trong aspx là gì?
Lớp ZipEntrySubclass như JarEntry (lý do tại sao ZipFile.entries sử dụng ký tự đại diện)? –
Cảm ơn Tom - sẽ chỉnh sửa câu trả lời của tôi :) –