Tôi đã thấy ký tự đại diện được sử dụng trước đây để có nghĩa là bất kỳ đối tượng nào - nhưng gần đây đã thấy việc sử dụng:
<? extends Object>
Vì tất cả các đối tượng đều mở rộng Đối tượng, hai cách sử dụng này có đồng nghĩa với nhau không?
Tôi đã thấy ký tự đại diện được sử dụng trước đây để có nghĩa là bất kỳ đối tượng nào - nhưng gần đây đã thấy việc sử dụng:
<? extends Object>
Vì tất cả các đối tượng đều mở rộng Đối tượng, hai cách sử dụng này có đồng nghĩa với nhau không?
Câu trả lời:
<?>
và <? extends Object>
đồng nghĩa, như bạn mong đợi.
Có một vài trường hợp với thuốc generic extends Object
không thực sự dư thừa. Ví dụ, <T extends Object & Foo>
sẽ gây ra T
để trở thành Object
dưới tẩy xoá, trong khi với <T extends Foo>
nó sẽ trở thành Foo
dưới tẩy xoá. (Điều này có thể thành vấn đề nếu bạn đang cố gắng duy trì khả năng tương thích với API pre-generics đã được sử dụng Object
.)
Nguồn: http://download.oracle.com/javase/tutorial/extra/generics/convert.html ; nó giải thích tại sao java.util.Collections
lớp của JDK có một phương thức với chữ ký này:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Object
thực sự là có ý nghĩa. Nếu tôi đã nhầm, thì tôi xin lỗi. Hy vọng rằng nó sẽ quan tâm đến những người khác khi xem câu hỏi của bạn, ít nhất.
Mặc dù <?>
được coi là một phím tắt cho <? extend object>
, có một sự khác biệt nhỏ giữa hai.
<?>
là có thể tái sử dụng trong khi <? extend object>
thì không. Lý do họ làm như vậy là để phân biệt loại có thể tái sử dụng dễ dàng hơn. Bất cứ điều gì giống như <? extends something>
, <T>
,<Integer>
là nonreifiable.
Ví dụ, mã này sẽ hoạt động
List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;
nhưng điều này gây ra lỗi
List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;
để biết thêm thông tin, hãy đọc các bộ sưu tập và tổng thể Java của Maurice Naftalin
<?>
là cách viết tắt của <? extends Object>
. Bạn có thể đọc liên kết chia sẻ bên dưới để biết thêm chi tiết.
<?>
"?"
biểu thị bất kỳ loại không xác định nào, Nó có thể đại diện cho bất kỳ Loại nào trong mã cho. Sử dụng ký tự đại diện này nếu bạn không chắc chắn về Loại.
ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number
Lưu ý: <?>
có nghĩa là bất cứ điều gì. Vì vậy, nó có thể chấp nhận Loại không được kế thừa từ Object
lớp.
<? extends Object>
<? extends Object>
nghĩa là bạn có thể chuyển một Đối tượng hoặc một lớp con mở rộng Object
lớp.
ArrayList<? extends Number> numberList = new ArrayList<Number>(); //Number of subclass
numberList = new ArrayList<Integer>(); //Integer extends Number
numberList = new ArrayList<Float>(); // Float extends Number
T - được sử dụng để biểu thị loại
E - được sử dụng để biểu thị phần tử
K - khóa
V - giá trị
N - cho số
Tham khảo:
Object
lớp.