2013-08-09 14 views
13

Co szukam:rodzajowych Java egzekwowania tego samego typu na klucze i wartości mapie

szukam skonstruować coś, co wymusza wpisać na oba klucze i wartości mapie: trochę jak Map<Key<X>, Value<X>> . Jednak chciałbym dodatkowo wymusić, aby typy pasowały do ​​w obrębie każdego wpisu klucz/wartość w numerze, ale pomiędzy wpisami, żaden typ nie powinien być egzekwowany.

Na przykład, w ramach tej samej mapie, te pary klucz/wartość należy uznać za ważne:

  • Key<Integer> mapy do Value<Integer>
  • Key<String> map do Value<String>
  • Key<Double> map do Value<Double>

Jednak coś takiego będzie nieprawidłowe:

  • Key<Integer> mapowanie do Value<String>
  • Key<Double> mapowanie do Value<Boolean>

Jak mogę to osiągnąć używając rodzajowych Java?


Co ja nie szukam:

  • Rozumiem, że mogę zaimplementować coś jak Set<Pair>, gdzie para akceptuje klucz/wartość tego samego typu. Jednak sprawdzanie tego za pomocą klawisza nie będzie już stałą operacją czasu.

  • Rozumiem, że mogłem zrobić coś takiego jak Map<Key<?>, Value<?>> i po prostu potwierdzić, że klucz i wartość są tego samego typu w środowisku wykonawczym. Jednak zastanawiałem się, czy jest to możliwe wyłącznie przy użyciu leków generycznych.

+0

Czy nie masz tej mapy w klasie ogólnej? –

+0

Niekoniecznie. Po prostu chce utworzyć "Mapę" gdziekolwiek, co wymusza "Klawisze muszą być tego samego typu co wartości (lub mają ten sam rodzaj w nich, w przypadku' Klucza '/' Wartość '), ale każda para klucz/wartość może być innego typu. " –

Odpowiedz

17

Można to zrobić, ale trzeba toczyć własne otoki na górze 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 
    } 
} 

Porównaj np Guva ClassToInstanceMap.

+0

Czy ma znaczenie, czy rzutuję wartość zwracaną na (Wartość) lub (Wartość )? –

Powiązane problemy