2015-01-06 21 views
5

Tôi đang làm cho Plugin bukkit và một hàm trả về List<Map<?, ?>>, nếu tôi làm điều đó:Làm thế nào để đúc Danh sách <Map<?, ?>> vào Danh sách <Bản đồ <Chuỗi, Chuỗi >>?

List<Map<String, String>> circle = FileManager.area.getMapList("circles"); 

tôi nhận được lỗi mà nó không thể được chuyển đổi. Làm gì?

Lỗi:

List<Map<?, ?>> cannot be converted into List<Map<String, String>> 
+0

lỗi chính xác của bạn là gì. Luôn đăng lỗi chính xác của bạn khi đặt câu hỏi. Lỗi là các câu trả lời có ý nghĩa bởi bất kỳ ngôn ngữ lập trình nào. Không đăng bài giống như nói "Xe của tôi đã phá vỡ xin vui lòng giúp đỡ" và đính kèm một hình ảnh của chiếc xe. – Kon

+0

lỗi chính xác - Danh sách > không thể chuyển đổi thành Danh sách > – XsergeiX

+2

http://upload.wikimedia.org/wikipedia/commons/b/bb/Barcroft_1100_Thomas_St_Car_Damaged_by_Tree_(7536694422).jpg - vui lòng giúp –

Trả lời

6

Bạn có thể ném bỏ tất cả các Generics bằng cách đúc các loại nguyên liệu, (List):

List<Map<String, String>> circle = (List) FileManager.area.getMapList("circles"); 

Lưu ý rằng như với hầu hết dàn diễn viên này là không an toàn - tốt hơn là tìm cách chuyển thông tin loại chính xác qua, như các câu trả lời khác đề xuất.

+0

Cảm ơn bạn rất lớn, nó đã hoạt động! – XsergeiX

1

getMapList trả về kiểu List<Map<?, ?>> into List<Map<String, String>>. Kể từ Generics là bất biến bạn cần phải phù hợp với các loại

List<Map<?, ?>> circle = FileManager.area.getMapList("circles"); 
+0

Không thể sử dụng 'List >' thay thế? – Maroun

+0

Xin lỗi nhưng đó là phương pháp của bukkit API, tôi không thể thay đổi nó – XsergeiX

+1

@MarounMaroun Thậm chí không, trình biên dịch là rất cụ thể về các loại, chỉ cho phép lập bản đồ chính xác. Hãy nhớ '?' Là một tập hợp nguồn, PECS, v.v. – Reimeus

1

Map<String, String> là loại phụ của Map<?, ?>, nhưng vì generics không phải là bất biến, điều này không có nghĩa là List<Map<String, String>> là loại phụ của List<Map<?, ?>>.

Nếu bạn chắc chắn rằng tất cả các khóa và giá trị là String trường hợp bạn có thể làm điều này

List<Map<String, String>> circle = (List<Map<String, String>>) (Object) FileManager.area.getMapList("circles"); 

Tuy nhiên tôi sẽ không khuyên bạn nên nó bởi vì nếu bất kỳ của các phím hoặc giá trị không phải là String s bạn có thể nhận a ClassCastException sau này, vì vậy bạn đang vứt bỏ sự đảm bảo rằng generics được cho là cung cấp.

Một thay thế sẽ là để tạo ra một new ArrayList<Map<String, String>>() và lặp qua các List<Map<?, ?>>, sau đó sử dụng instanceof để rà soát tất cả các phím và các giá trị trong mỗi Map<?, ?>String. Chỉ khi kiểm tra thành công instanceof nếu bạn thêm mục nhập.

0

chủ yếu được sử dụng để gán từ một số giá trị được xác định như: Bản đồ m = new HashMap();

Và việc sử dụng không tốt, bởi vì bạn cần phải truyền một cách rõ ràng (có nghĩa là bạn biết trước kiểu thời gian chạy của mình).

Thông thường bạn chỉ định một cách rõ ràng sự trở lại values.So chúng ta hãy xem bởi các trường hợp:

1) Bạn muốn viết chức năng rất chung chung mà được chuỗi và trả về Danh sách>, sau đó bạn có thể viết như thế này

<K, V> List<Map<K, V>> getMapList(String s) { 
     ... 
} 

Java sẽ suy ra loại K, V tùy thuộc vào những gì bạn đang gán cho.

2) Bạn muốn trở về một số loại hình cụ thể, sau đó sử dụng loại rằng:

<Integer, String> List<Map<Integer, String>> getMapList(String s) { 
     ... 
} 
Các vấn đề liên quan