2013-08-09 43 views
13

Những gì tôi đang tìm kiếm:Java Generics thực thi cùng loại cho các phím và các giá trị của bản đồ

Tôi đang tìm để xây dựng một cái gì đó mà thi hành gõ trên cả khóa và giá trị của bản đồ: loại giống như Map<Key<X>, Value<X>> . Tuy nhiên, tôi cũng muốn thực thi các loại đó khớp với trong mỗi mỗi mục nhập khóa/giá trị, nhưng giữa các mục nhập, không loại nào phải được thực thi.

Ví dụ, trong cùng một bản đồ, những cặp khóa/giá trị nên được coi là hợp lệ:

  • Key<Integer> bản đồ để Value<Integer>
  • Key<String> bản đồ để Value<String>
  • Key<Double> bản đồ để Value<Double>

Tuy nhiên, một cái gì đó như thế này sẽ không hợp lệ:

  • Key<Integer> bản đồ để Value<String>
  • Key<Double> bản đồ để Value<Boolean>

Làm thế nào tôi có thể thực hiện điều này bằng Java Generics?


Những gì tôi đang không tìm kiếm:

  • Tôi hiểu rằng tôi có thể thực hiện một cái gì đó giống như Set<Pair>, nơi cặp chấp nhận Key/Value cùng loại. Tuy nhiên, tìm kiếm điều này bằng cách phím sẽ không còn là một hoạt động liên tục thời gian.

  • Tôi hiểu rằng tôi có thể làm điều gì đó như Map<Key<?>, Value<?>> và chỉ khẳng định rằng Khóa và giá trị là cùng một loại khi chạy. Tuy nhiên, tôi đã tự hỏi nếu điều này là có thể sử dụng đúng cách generics.

+0

Bạn không có Bản đồ đó trong một lớp học chung? –

+0

Không nhất thiết. Chỉ cần tìm cách tạo một 'Bản đồ' ở bất cứ nơi nào chỉ thực thi" Các khóa phải cùng loại với các giá trị (hoặc có cùng kiểu chung trong chúng, trong trường hợp của 'Key '/'Giá trị '), nhưng mỗi cặp khóa/giá trị có thể thuộc một loại khác. " –

Trả lời

17

Bạn có thể làm điều này, nhưng bạn phải cuộn wrapper của riêng bạn trên đỉnh của một Map:

class MyTypeSafeMap { 
    private Map<Key<?>, Value<?>> map; 
    public <T> void put(Key<T> key, Value<T> value) { 
    map.put(key, value); 
    } 

    public <T> Value<T> get(Key<T> key) { 
    return (Value) map.get(key); 
    // we know it's safe, but the compiler can't prove it 
    } 
} 

Hãy so sánh ví dụ Ổi của 01ava.

+0

Nó có tạo ra bất kỳ sự khác biệt nào cho dù tôi truyền giá trị trả về (Giá trị) hoặc (Giá trị )? –

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