Условия хранения Java по универсальному типу - PullRequest
2 голосов
/ 16 ноября 2010

Я читал Effective Java и решил попробовать применить кое-что из того, что я изучил, к действию.Я пытаюсь эффективно создать Multimap<?, Condition<?> >, где подстановочный знак будет одинакового типа и для ключа, и для значения, но это будут разные, разные типы.

Вот элемент из книгиЯ смотрю на: Item 29

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

Так что я буду делать mmap.put(Class<Integer>, ConditionMapping<Integer>), когда я получу get, у меня нет универсального типа ConditionMapping, поэтому я получаю предупреждение о непроверенном приведении.

У меня есть метод get, которыйЯ хочу иметь подпись <T> List<Condition <T> >(Class<T> type)

Из-за стирания типа, могу ли я единственный вариант убедиться, что condition.value имеет тип T, и создать новый список объектов?

Я мог бы просто проигнорировать предупреждение о неконтролируемых ролях, но я просто стараюсь этого не делать.Какие-либо предложения?Подсказки?Уловки?

Ответы [ 4 ]

1 голос
/ 01 февраля 2011

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

1 голос
/ 01 февраля 2011

Если вы сделаете свой интерфейс расширенным Multimap<Void, Condition<?>>, это позволит вашему пользователю вызывать некоторые из методов, которые не зависят от безопасности типов (например, containsKey), но не добавлять записи (минуя прокси-методы с проверкой типов), если они не используютнепроверенные приведения.

interface ConditionMapBase<T> extends Multimap<T, Condition<?>> {
}
interface ConditionMap extends ConditionMapBase<Void> {
    <T>boolean putCondition(T key, Condition<T> value);
    <T>Collection<Condition<T>> getConditions(T key);
}
class ConditionMapImpl
extends ForwardingMultimap<Void, Condition<?>>
implements ConditionMap {

    ConditionMapImpl() {
        delegate = HashMultimap.create();
    }
    @SuppressWarnings("unchecked")
    @Override
    protected Multimap<Void, Condition<?>> delegate() {
        return (Multimap<Void, Condition<?>>) (Multimap<?, ?>) delegate;
    }
    private final Multimap<Object, Condition<?>> delegate;
    @SuppressWarnings("unchecked")
    @Override
    public <T> Collection<Condition<T>> getConditions(T key) {
        return (Collection<Condition<T>>) (Collection<?>) ((ConditionMapBase<T>) this).get(key);
    }
    @SuppressWarnings("unchecked")
    @Override
    public <T> boolean putCondition(T key, Condition<T> value) {
        return ((ConditionMapBase<T>) this).put(key, value);
    }
}
0 голосов
/ 01 февраля 2011

Это может быть шаг в правильном направлении.

<Multimap<Class<?>, Condition<?>>
0 голосов
/ 16 ноября 2010

Вы могли бы создать MyClass, а затем передать ему свой собственный тип и заключить в нем Multimap.Невозможность шаблонов в Java часто можно решить, добавив, так сказать, еще один слой и создав шаблон класса, который вам действительно нужен, поскольку вы можете получить тип «T» таким образом, который затем сможете использовать для списков или карт, ис тех пор гарантируйте, что это будет одинаковым для нескольких шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...