Рассмотрим следующий автономный образец:Java дженериков: коллекция супер супер некоторого типа
import java.util.*;
class TestApplication
{
interface Type<C>
{
Collection<Type<? super C>> getSuperTypes();
}
static class Test<C>
{
private final Type<? super C> mySuperType = get(null);
public Collection<Type<? super C>> getSuperTypes()
{
Collection<Type<? super C>> superTypes = new ArrayList<>();
superTypes.add(mySuperType);
//directly passing the super-types to addAll() works
superTypes.addAll(mySuperType.getSuperTypes());
//but how can I declare the variable to temporarily hold the supers?
Collection<Type<? super C>> superSuperTypes = mySuperType.getSuperTypes(); //ERROR
superTypes.addAll(superSuperTypes);
return superTypes;
}
}
public static <T> T get(T value)
{
return value;
}
}
Итак, у меня есть класс, который представляет собой тип, и он имеет супер-тип, который в свою очередь имеет супер-типы, и я хочу иметь функцию, которая возвращает плоский набор всех супертипов типа.
Итак, я объявляю коллекцию супертипов, и я добавляю к нему непосредственный супертип текущего типа, а затем мне нужно также добавить супертипы супертипа. (Не важно, что это ужасно неэффективно, на самом деле я делаю это гораздо эффективнее, но это не имеет никакого отношения.)
superTypes.addAll()
Передача этого результата superType.getSuperTypes()
.
Когда результат superType.getSuperTypes()
напрямую передается в номер superTypes.addAll()
без промежуточной переменной, никакой проблемы не возникает.
Но если я хочу объявить промежуточную переменную superSuperTypes
, чтобы передать результат superType.getSuperTypes()
, прежде чем передать ее superTypes.addAll()
, я не могу найти способ объявить эту переменную так, чтобы она была скомпилирована. Как он стоит, он дает следующее сообщение:
Error:(100, 84) java: incompatible types: java.util.Collection<TestApplication.Type<? super capture#1 of ? super C>> cannot be converted to java.util.Collection<TestApplication.Type<? super C>>
Итак: как должен superSuperTypes
быть объявлен для того, чтобы иметь возможность присвоить ему результат superType.getSuperTypes()
, а затем передать его в superTypes.addAll()
?
Просто быть педантом, в Java, фигурные скобки ('{ '), как правило, положить на той же линии, что и заявление они идут с (если заявления, функция/декларация класса и т.д. .). Это не делает разницы во времени компиляции и так же читаемо, но [эй, Oracle говорит так] (http://www.oracle.com/technetwork/java/codeconventions-150003.pdf#G3.182). –
@QPaysTaxes Вы не * серьезно * хотите начать обсуждение стиля кода, не так ли? И отсутствие египетских скобок - не единственное отклонение моего стиля от догмы Oracle, не так ли? –
У меня такое чувство, что вы увидели первое предложение и сразу же поняли, что я был какой-то мудаком. Не стесняйтесь читать все это. Строго говоря, у вас также не должно быть пробелов между круглыми скобками и их внутренностями, но я не видел этого в то время. Я никогда не говорил, что хочу обсудить это; Я просто указывал на нарушение официального Java MoS. –