tôi không hoàn toàn đồng ý với câu trả lời được chấp nhận, trong đó nó nói:
trong trường hợp này, bạn cần cung cấp cho các trình biên dịch một chút giúp đỡ bằng cách dứt khoát cho biết kiểu trả về bạn mong đợi.
Điều này không đúng với tôi. Khi tôi hiểu phương pháp chung và suy luận kiểu, kiểu được cung cấp trong dấu ngoặc vuông không trực tiếp biểu thị kiểu trả về của phương thức chung. Thay vào đó, loại T
có thể là loại trả về, loại đối số, loại biến cục bộ được liên kết với phương pháp chung.
Thực tế, nhờ cơ chế suy luận loại, chúng tôi không cần phải chỉ định tham số loại T
trong hầu hết các trường hợp (không chỉ trong một số trường hợp). Trong ví dụ của bạn, <T>
có thể được bỏ qua một cách an toàn khỏi lời gọi phương thức ObjectGenerator.<T> getObject(objectName)
như trong hầu hết các trường hợp khác. Điều này là do loại T
của phương pháp chung có thể dễ dàng suy ra từ loại kết quả được chỉ định hoặc trả về. Nói cách khác, vì bạn khai báo private T object
trước khi phương thức gọi loại T
sẽ được suy ra thành công là T
.
tuyên bố Mỹ có thể được hỗ trợ bởi các tuyên bố sau từ a definitive tutorial:
Loại suy luận là khả năng của một trình biên dịch Java để nhìn vào từng phương pháp invocation và tuyên bố tương ứng để xác định loại luận (hoặc đối số) điều đó làm cho lời gọi được áp dụng. Thuật toán suy luận xác định loại đối số và, nếu có sẵn, loại kết quả được gán hoặc trả về. Cuối cùng, thuật toán suy luận cố gắng tìm loại cụ thể nhất hoạt động với tất cả các đối số.
Hai ví dụ về cách suy luận hoạt động:
static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());
Loại T
được suy ra như Serializable
dựa trên loại chuyển nhượng kê khai.
public static <U> void addBox(U u, java.util.List<Box<U>> boxes) {}
BoxDemo.<Integer>addBox(Integer.valueOf(10), listOfIntegerBoxes);
Loại U
được suy ra như Integer
dựa trên các loại của các đối số truyền (nghĩa là., Integer.valueOf(10)
là loại Integer
). Do đó, <Integer>
có thể được bỏ qua một cách an toàn khỏi lời gọi phương thức ở trên. Để tóm tắt, trừ khi chúng tôi không thể suy ra tham số kiểu của phương thức chung từ kiểu đối số hoặc loại kết quả được gán hoặc trả về (khi gọi phương thức), chúng tôi có thể bỏ qua một cách an toàn đặc tả kiểu ngay trước khi gọi phương thức.
+1 vì trước đây tôi chưa từng thấy điều này. –
Tôi không hỏi về ý nghĩa của nó, nhưng chỉ là về một dòng mã. Tôi có thể thay đổi chữ ký phương thức thành ' T getObject (Tên chuỗi, Class clazz)' - nó không quan trọng. Chỉ có một dòng này với lời gọi phương thức đó với '' gây nhầm lẫn cho tôi –
emka86