Map<String, Integer> instance = new TreeMap<String, Integer>();
@SuppressWarnings("unchecked")
Map<String, Integer> map =
createMap((Class<? extends Map<String, Integer>>)instance.getClass());
map.put("x", 1);
System.out.println("THIS IS x: " + map.get("x"));
này một cách thích hợp sẽ in ra 1. Việc thực hiện phương pháp này là nhiều khả năng
try
{
return clazz.newInstance();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
Một thực hiện tốt hơn các API của họ sẽ để họ yêu cầu bạn cho các loại hình, T
, và cho họ trả lại số Map
trong lựa chọn của họ thay vì yêu cầu bạn cung cấp tất cả chi tiết. Nếu không, miễn là họ không được điền vào Map
với bất kỳ dữ liệu, bạn có thể nhanh chóng một Map
với đối số kiểu generic mình như vậy:
public static <T> Map<String, T> getMap()
{
return new TreeMap<String, T>();
}
Sau đó bạn có thể truy cập mà không có cảnh báo:
// note the lack of type arguments, which are inferred
Map<String, Integer> instance = getMap();
// alternatively, you could do it more explicitly:
// Map<String, Integer> instance = ClassName.<Integer>getMap();
có thực sự không có lý do để họ yêu cầu bạn cho các loại Class
của Map
bạn ngoại trừ việc cung cấp cho bạn trở lại một kết hợp chính xác để thực hiện (ví dụ, nếu bạn dính vào một HashMap
, sau đó bạn sẽ liên lạc lại một HashMap
, và nếu bạn dính vào một TreeMap
, sau đó bạn sẽ quay lại TreeMap
). Tuy nhiên, tôi nghi ngờ rằng TreeMap
sẽ mất bất kỳ Comparator
nào mà nó được xây dựng và vì đó là trường bất biến (final
) của TreeMap
, thì bạn không thể sửa lỗi đó; điều đó có nghĩa là Map
không giống nhau trong trường hợp đó, cũng không phải là khả năng bạn muốn.
Nếu chúng được điền vào số Map
với dữ liệu, thì điều đó thậm chí còn ít ý nghĩa hơn. Bạn luôn có thể vượt qua trong trường hợp của số Map
để điền hoặc trả lại số Map
mà bạn có thể chỉ cần bọc (ví dụ: new TreeMap<String, Integer>(instance);
) và họ phải biết số nào Map
cung cấp tiện ích nhiều nhất cho dữ liệu.
Bạn không thể do loại xóa. Đặc biệt, chữ ký phương thức không có ý nghĩa bởi vì bạn đang cố gắng lấy 'T' ra mặc dù bạn đang tham gia vào một' Lớp' cho một 'Bản đồ' với tham số giá trị là' T'. Bạn sẽ không bao giờ có thể có được kiểu lồng nhau mà không có một cá thể hiện có của đối tượng. (Bạn có thể truyền vào '(new HashMap()). GetClass()', nhưng bạn vẫn không thể lấy 'Integer' trở lại phương thức đó). –
pickypg
createMap() là từ một thư viện chúng tôi sử dụng. Phải có cách gọi phương thức đó. –
Tôi đặt câu hỏi tính hợp pháp của đối tượng được trả về. Nó được cho là trả về một cá thể của tham số value, 'T', khi được chuyển trong' Lớp' cho một 'Bản đồ', và tên phương thức là' createMap'. Không ai trong số đó có ý nghĩa gì cả. – pickypg