Как Вы бросаете Список супертипов к Списку подтипов?

Если бы вы могли подождать некоторое время ... похоже, что для C # 4.0 может существовать эквивалент C # для irb Ruby вовремя, Андерс Х. продемонстрировал сеанс интерактивной консоли, где вы могли бы ввести произвольный код C # и увидеть результаты в его ' Часть будущего C # на PDC 2008. Вы можете даже извлечь из него окно WPF, а затем поиграть с ним через интерфейс консоли. Довольно круто.

230
задан Paul Bellora 25 September 2014 в 15:17
поделиться

8 ответов

Simply casting to List almost works; but it doesn't work because you can't cast a generic type of one parameter to another. However, you can cast through an intermediate wildcard type and it will be allowed (since you can cast to and from wildcard types, just with an unchecked warning):

List<TestB> variable = (List<TestB>)(List<?>) collectionOfListA;
558
ответ дан 23 November 2019 в 03:37
поделиться

если у вас есть объект класса TestA , вы не можете преобразовать его в TestB . каждый TestB является TestA , но не наоборот.

в следующем коде:

TestA a = new TestA();
TestB b = (TestB) a;

вторая строка вызовет исключение ClassCastException .

, вы можете привести ссылку TestA , только если сам объект - TestB . например:

TestA a = new TestB();
TestB b = (TestB) a;

поэтому вы не всегда можете преобразовать список TestA в список TestB .

2
ответ дан 23 November 2019 в 03:37
поделиться

Когда вы приводите ссылку на объект, вы просто приводите тип ссылки, а не тип объекта. приведение типов не изменит фактический тип объекта.

В Java нет неявных правил для преобразования типов объектов. (В отличие от примитивов)

Вместо этого вам нужно указать, как преобразовать один тип в другой и вызвать его вручную.

public class TestA {}
public class TestB extends TestA{ 
    TestB(TestA testA) {
        // build a TestB from a TestA
    }
}

List<TestA> result = .... 
List<TestB> data = new List<TestB>();
for(TestA testA : result) {
   data.add(new TestB(testA));
}

Это более подробный вариант, чем в языке с прямой поддержкой, но он работает, и вам не нужно делать это очень часто.

3
ответ дан 23 November 2019 в 03:37
поделиться

Это возможно из-за стирания типа. Вы обнаружите, что

List<TestA> x = new ArrayList<TestA>();
List<TestB> y = new ArrayList<TestB>();
x.getClass().equals(y.getClass()); // true

Внутри оба списка имеют тип List . По этой причине вы не можете применить одно к другому - кастовать нечего.

2
ответ дан 23 November 2019 в 03:37
поделиться

Я думаю, что вы выполняете приведение в неправильном направлении ... если метод возвращает список объектов TestA , то преобразовывать их в TestB .

Обычно вы просите компилятор разрешить вам выполнять операции TestB над типом TestA , который их не поддерживает.

18
ответ дан 23 November 2019 в 03:37
поделиться

You cannot cast List to List as Steve Kuo mentions BUT you can dump the contents of List into List. Try the following:

List<TestA> result = new List<TestA>();
List<TestB> data = new List<TestB>();
result.addAll(data);

I've not tried this code so there are probably mistakes but the idea is that it should iterate through the data object adding the elements (TestB objects) into the List. I hope that works for you.

6
ответ дан 23 November 2019 в 03:37
поделиться

преобразование универсальных типов невозможно, но если вы определите список другим способом, в нем можно сохранить TestB:

List<? extends TestA> myList = new ArrayList<TestA>();

У вас все еще есть проверка типов, когда вы используете объектов в списке.

113
ответ дан 23 November 2019 в 03:37
поделиться
Другие вопросы по тегам:

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