Подтвердить что ты не робот

Неопределенный контейнер для хранения типично типизированных объектов в Java

Я пытаюсь следовать типичному разнородному шаблону контейнера Джошуа Блоха из Effective Java, чтобы создать контейнер объектов (MyGeneric<T>) с Class<T> в качестве ключа.

  public class MyClass {

    private Map<Class<?>, MyGeneric<?>> myContainer =
      new HashMap<Class<?>, MyGeneric<?>>();

    public <T> void addToContainer(Class<T> class, MyGeneric<T> thing) {
      myContainer.put(class, thing);
    }

    public <T> MyGeneric<T> getFromContainer(Class<T> class) {
      return (MyGeneric<T>)(myContainer.get(klass));
    }
  }

Проблема в getFromContainer Мне нужно выполнить неконтролируемый отбор. В контейнере Джоша Блоха он выполняет безопасный бросок - но в моем случае я не вижу способа, как это возможно.

Есть ли у кого-нибудь идеи?

Cheers, Ник.

4b9b3361

Ответ 1

В блоховской версии используется Class.cast() - который реализован как return (T) obj, неконтролируемый актерский состав. Он обманывает в том смысле, что предупреждение компилятора о неконтролируемом акте перемещается в предварительно скомпилированную библиотеку lib. Безопасность типов броска не защищена компилятором, а логикой приложения.

Вы также не должны беспокоиться о неограниченном выборе. Существуют типы отношений, которые не могут быть выражены на языке, но программисты знают, что это правда. Поэтому просто отмените компилятор, скажите, что бросок безопасен.

Коррекция

Мое понимание "непроверенного актера" было неверным.

Class.cast() не содержит "непроверенный бросок". Приведение выполняется после "проверки", если приведение выполняется во время выполнения, это гарантирует успех.

T cast(Object obj)
    if obj is instance of this class   // check
        return (T)obj;                 // cast 
    else
        throw new ClassCastException