Я не очень понимаю вашу проблему. Это то, что вы ищете?
class MyClass {
protected static <T> Set<T> SetFactory(int size)
{
return new HashSet<T>(size);
}
protected static <K, V> Map<K, Set<V>> mapFactory(Collection<K> keys)
{
Map<K, Set<V>> result = new HashMap<K, Set<V>>(keys.size());
for (K key : keys)
result.put(key, MyClass.<V>SetFactory(20));
return result;
}
}
Обратите внимание на явный параметр типа (<V>
) при вызове универсального метода.
Обновление:
Я, наверное, ошибаюсь, но констатирую
не актерский состав кажется мне семантикой
- необходимость поставить MyClass. на фронте кажется довольно близко к необходимости
бросать. Можете ли вы объяснить разницу?
Приведение было бы (Set<V>) SetFactory(20)
, и оно генерировало бы предупреждение компилятора о безопасности типов, потому что при стирании типов нет способа проверить, что тип времени выполнения результата функции SetFactory
имеет тип V
.
Использование параметра типа в вызове метода очень похоже на выражение new HashSet<V>()
. Когда вы вызываете конструктор универсального класса, вы должны указать аргументы типа для конструктора. Всякий раз, когда вы вызываете универсальный метод, должны быть указаны параметры типа. Зачастую они могут быть получены из присвоения результата метода или из параметров метода, но не всегда.
Однако это не актерский состав. Приведение всегда выполняет проверку типа во время выполнения. Указание универсального типа, как я показываю здесь, работает во время компиляции.