Вы не можете этого сделать. У вас есть Collection
Теперь представьте, что у кого-то есть ваша возвращенная коллекция - и он пытается вставить другой подкласс SuperClass, SomeOtherClass. Это должно быть разрешено на вашей коллекции SuperClass - но не может, потому что на самом деле это Collection
Основываясь на верхнем ответе на этот вопрос: Как вы приведете список супертипов к списку подтипов?
Я верю, что это возможно сделать
Collection<SomeSuperType> variable =
(Collection<SomeSuperType>)(Collection<?>) collectionOfSomeType;
За счет «непроверенного» предупреждения. В связанном вопросе была выражена обеспокоенность по поводу «хакерства» этого ответа из-за отсутствия безопасности типов. Однако в контексте этого вопроса (а именно, приведения коллекции подтипов к коллекции их супертипов) я не вижу проблем или возможных исключений ClassCastException. И в любом случае, это работает довольно хорошо.
Я не уверен, почему; возможно, кто-то еще может объяснить это; но это работает, если вы делаете:
public abstract class SomeSuperClass<E> {
abstract public Collection<SomeSuperClass<E>> getCollection();
}
и:
public class Someclass extends SomeSuperClass {
@Override
public Collection<Someclass> getCollection() {
// TODO Auto-generated method stub
return null;
}
}
возможно, вам следует найти обходной путь.
например, вы должны создать какой-нибудь «HolderClass» с общим расширением, и тогда вы сможете установить погодные условия для своего SomeClass, погодного для своего SomeSuperClass.
взгляните:
public class HolderClass<E extends SomeSuperClass> {
private final Collection<E> myClass;
public HolderClass() {
myClass = new ArrayList<E>();
}
public void putSomeClass(final E clazz) {
myClass.add(clazz);
}
public Collection<E> getMyClasses() {
return myClass;
}
}
и вы можете создать коллекцию следующим образом:
HolderClass<SomeSuperClass> holderClass = new HolderClass<SomeSuperClass>();
holderClass.putSomeClass(new SomeClass());
holderClass.putSomeClass(new SomeSuperClass());
и теперь, когда вы вызываете getMyClasses (), вы получаете коллекцию SomeSuperClasses
Будет Коллекция extends SomeSuperClass>
не делаете то, что хотите?
.NET 4.0 вводит ковариацию и контравариацию для дженериков:
http://msdn.microsoft.com/en-us/library/dd799517(VS.100 ).aspx