2012-06-28 33 views
5

Đây có lẽ là một sự hiểu lầm đơn giản về phía tôi.Không thể truyền một HashMap <String, String> đến một Giao diện mở rộng Bản đồ <String, String>

Có một giao diện đơn giản:

public interface IParams extends Map<String,String> { 
} 

Sau đó, tôi cố gắng sử dụng:

IParams params = (IParams) new HashMap<String,String>(); 

Passes cú pháp và biên dịch nhưng khi chạy tôi nhận được:

java.lang.ClassCastException: java.util.HashMap cannot be cast to com.foobar.IParams 

Bất kỳ cái nhìn sâu sắc nơi sự hiểu lầm của tôi về Generics là trong trường hợp này?

+5

You are not hiểu lầm generics, bạn đang hiểu nhầm thừa kế . – Marcelo

+0

Bất kỳ lý do gì để mở rộng Bản đồ? Bạn có ghi đè bất kỳ phương pháp nào không? – kosa

+0

Mục đích là tạo một giao diện che giấu các generics, và cũng để giữ (không được hiển thị trong ví dụ) các định nghĩa chuỗi khóa bản đồ –

Trả lời

10

HashMap không triển khai giao diện IParams, vì vậy, bạn không thể đúc HashMap thành IParams. Điều này không liên quan gì đến Generics.

IParamsHashMap là "anh chị em", theo nghĩa là cả hai đều triển khai hoặc mở rộng Map. Nhưng điều đó không có nghĩa là bạn có thể xem một số HashMap như thể đó là số IParams. Giả sử bạn sẽ thêm phương thức vào giao diện IParams của mình.

public interface IParams extends Map<String, String> { 
    void someMethod(); 
} 

ofcourse, someMethod không tồn tại trong HashMap. Nếu việc đúc HashMap đến IParams sẽ hoạt động, bạn sẽ mong đợi điều gì sẽ xảy ra nếu bạn cố gắng gọi phương thức?

IParams params = (IParams) new HashMap<String,String>(); 

// What's supposed to happen here? HashMap doesn't have someMethod. 
params.someMethod(); 

đối với nhận xét của bạn Với:

Mục đích là để tạo ra một giao diện mà giấu generics, và cũng để giữ (không hiển thị trong ví dụ) bản đồ định nghĩa chuỗi chìa khóa

Việc bạn có thể làm là tạo một lớp thực hiện IParams và mở rộng HashMap:

public class Params extends HashMap<String, String> implements IParams { 
    // ... 
} 

IParams params = new Params(); 
+1

Lời giải thích tuyệt vời, tôi không nghĩ về anh chị em. Tôi đã cố gắng quá nhiều để sử dụng triển khai HashMap trực tiếp và đề xuất tạo lớp bê tông nhanh của bạn trông khá hợp lý. Cảm ơn Jesper. –

3

HashMap thực hiện giao diện Map nhưng không được thực hiện giao diện của bạn IParams ngay cả khi bạn giao diện bắt nguồn từ Map, bạn không thể bỏ nó vào IParams vì nó không phải là một loại IParams

Các vấn đề liên quan