Гетерогенный контейнер для хранения объектов общего типа в Java - PullRequest
13 голосов
/ 26 мая 2011

Я пытаюсь следовать типу безопасного гетерогенного контейнера Джошуа Блоха из 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. Мне нужно выполнить непроверенное приведение. В контейнере Джоша Блоха он выполняет безопасное приведение - но в моем случае я не могу понять, как это возможно.

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

Ура, Ник.

1 Ответ

9 голосов
/ 26 мая 2011

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

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

Исправление

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

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

T cast(Object obj)
    if obj is instance of this class   // check
        return (T)obj;                 // cast 
    else
        throw new ClassCastException
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...