Если бы вы могли подождать некоторое время ... похоже, что для C # 4.0 может существовать эквивалент C # для irb Ruby вовремя, Андерс Х. продемонстрировал сеанс интерактивной консоли, где вы могли бы ввести произвольный код C # и увидеть результаты в его ' Часть будущего C # на PDC 2008. Вы можете даже извлечь из него окно WPF, а затем поиграть с ним через интерфейс консоли. Довольно круто.
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;
если у вас есть объект класса 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
.
Когда вы приводите ссылку на объект, вы просто приводите тип ссылки, а не тип объекта. приведение типов не изменит фактический тип объекта.
В 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));
}
Это более подробный вариант, чем в языке с прямой поддержкой, но он работает, и вам не нужно делать это очень часто.
Это возможно из-за стирания типа. Вы обнаружите, что
List<TestA> x = new ArrayList<TestA>();
List<TestB> y = new ArrayList<TestB>();
x.getClass().equals(y.getClass()); // true
Внутри оба списка имеют тип List
. По этой причине вы не можете применить одно к другому - кастовать нечего.
Я думаю, что вы выполняете приведение в неправильном направлении ... если метод возвращает список объектов TestA
, то преобразовывать их в TestB
.
Обычно вы просите компилятор разрешить вам выполнять операции TestB
над типом TestA
, который их не поддерживает.
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.
Вы действительно не можете *:
Пример взят из этого руководства по Java
Предположим, есть два типа A
и B
таким образом, что B расширяет A
.
Тогда следующий код верен:
B b = new B();
A a = b;
Предыдущий код действителен, потому что B
является подклассом A
.
Что теперь происходит с List
и List
?
Оказывается, List
не является подклассом List
, поэтому мы не можем записать
List<B> b = new ArrayList<>();
List<A> a = b; // error, List<B> is not of type List<A>
Кроме того, мы не может даже написать
List<B> b = new ArrayList<>();
List<A> a = (List<A>)b; // error, List<B> is not of type List<A>
*: Чтобы сделать преобразование возможным, нам нужен общий родительский элемент для List
и List
: ] Список >
например. Следующее является действительным:
List<B> b = new ArrayList<>();
List<?> t = (List<B>)b;
List<A> a = (List<A>)t;
Однако вы получите предупреждение. Вы можете подавить его, добавив @SuppressWarnings ("unchecked")
в свой метод.
преобразование универсальных типов невозможно, но если вы определите список другим способом, в нем можно сохранить TestB:
List<? extends TestA> myList = new ArrayList<TestA>();
У вас все еще есть проверка типов, когда вы используете объектов в списке.