кастинг Набора <SomeClass> к Набору <SomeSuperClass>

Да, такое же поведение в python3 также

22
задан skrebbel 17 March 2010 в 09:14
поделиться

7 ответов

Вы не можете этого сделать. У вас есть Collection и вы хотите вернуть Collection

Теперь представьте, что у кого-то есть ваша возвращенная коллекция - и он пытается вставить другой подкласс SuperClass, SomeOtherClass. Это должно быть разрешено на вашей коллекции SuperClass - но не может, потому что на самом деле это Collection, неизвестный никому, кроме частного члена A.

11
ответ дан 29 November 2019 в 05:10
поделиться

Основываясь на верхнем ответе на этот вопрос: Как вы приведете список супертипов к списку подтипов?

Я верю, что это возможно сделать

Collection<SomeSuperType> variable =
                    (Collection<SomeSuperType>)(Collection<?>) collectionOfSomeType;

За счет «непроверенного» предупреждения. В связанном вопросе была выражена обеспокоенность по поводу «хакерства» этого ответа из-за отсутствия безопасности типов. Однако в контексте этого вопроса (а именно, приведения коллекции подтипов к коллекции их супертипов) я не вижу проблем или возможных исключений ClassCastException. И в любом случае, это работает довольно хорошо.

1
ответ дан Community 29 November 2019 в 05:10
поделиться

Я не уверен, почему; возможно, кто-то еще может объяснить это; но это работает, если вы делаете:

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;
    }
}
0
ответ дан Stefan Hendriks 29 November 2019 в 05:10
поделиться

возможно, вам следует найти обходной путь.

например, вы должны создать какой-нибудь «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

0
ответ дан 29 November 2019 в 05:10
поделиться

Будет Коллекция не делаете то, что хотите?

21
ответ дан 29 November 2019 в 05:10
поделиться

Коллекция SubType не заменяема на SuperType.

-3
ответ дан 29 November 2019 в 05:10
поделиться

.NET 4.0 вводит ковариацию и контравариацию для дженериков:

http://msdn.microsoft.com/en-us/library/dd799517(VS.100 ).aspx

-3
ответ дан 29 November 2019 в 05:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: