2015-02-27 5 views
-1

Рассмотрим следующий автономный образец: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()?

+0

Просто быть педантом, в Java, фигурные скобки ('{ '), как правило, положить на той же линии, что и заявление они идут с (если заявления, функция/декларация класса и т.д. .). Это не делает разницы во времени компиляции и так же читаемо, но [эй, Oracle говорит так] (http://www.oracle.com/technetwork/java/codeconventions-150003.pdf#G3.182). –

+0

@QPaysTaxes Вы не * серьезно * хотите начать обсуждение стиля кода, не так ли? И отсутствие египетских скобок - не единственное отклонение моего стиля от догмы Oracle, не так ли? –

+0

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

ответ

1

Подобно

Collection<? extends Type<? super C>> superSuperTypes = mySuperType.getSuperTypes(); 
+0

Ничего себе. Это сработало. (Извините, я не мог проверить ранее.) –

Смежные вопросы