Во-первых, сделайте класс списка реализующим Сериализуемый .
public class Object implements Serializable{}
Затем вы можете просто привести список к (Сериализуемый). Вот так:
List<Object> list = new ArrayList<Object>();
myIntent.putExtra("LIST", (Serializable) list);
И чтобы получить список, который вы делаете:
Intent i = getIntent();
list = (List<Object>) i.getSerializableExtra("LIST");
Вот и все.
Компилятор знает, что строка никогда не может быть int?
, чтобы он вам это сказал. Это не значит, что int?
бесполезен. Ваш вариант использования далек от нормального. Обычный вариант - «Я хочу представить целое число и вероятность того, что значение отсутствует / неизвестно». Для этого очень хорошо работает int?
.
Почему вы ожидаете, что ваш исходный код будет работать? Почему это может быть полезно?
Обратите внимание, что вы можете использовать как
с типами, допускающими значение NULL, для распаковки:
object o = "hello";
int? i = o as int?;
if (i == null)
{
// o was not a boxed int
}
else
{
// Can use i.Value to recover the original boxed value
}
РЕДАКТИРОВАТЬ: увидев ваш комментарий, вы не используете как
для анализа. Вероятно, вы захотите использовать int.TryParse
:
string text = "123":
int value;
if (int.TryParse(text, out value))
{
Console.WriteLine("Parsed successfully: {0}", value);
}
else
{
Console.WriteLine("Unable to parse text as an integer");
}
Если вы ' убедитесь, что строка должна быть целым числом (в противном случае это ошибка), тогда вы можете просто использовать int.Parse
:
int value = int.Parse(text);
Это вызовет исключение в случае сбоя синтаксического анализа.
Обратите внимание также что оба этих метода позволяют вам указать поставщика формата (обычно информацию о культуре), который позволяет вам выражать, как числа выражаются в этом формате (например, разделители тысяч).
РЕДАКТИРОВАТЬ: В ответ на ваш новый вопрос компилятор предотвращает это, потому что знает, что строка не может , возможно, быть заключенным в рамку int - преобразование никогда не будет успешным. Когда он знает только, что исходное значение является объектом, он может преуспеть.
Например, предположим, я сказал вам: «Вот форма: это квадрат?» Это разумный вопрос. Разумно спросить: можно » Трудно сказать, не глядя на форму.
Но если бы я сказал: «Вот треугольник: это квадрат?» Тогда у вас будет разумное право посмеяться мне в лицо, поскольку треугольник не может быть квадратом - вопрос не имеет смысла.
int? является целым числом, допускающим значение NULL, оно не имеет ничего общего с приведением типов и ключевым словом as. «String» - это объект строкового типа, который не может быть преобразован в int (допускающий или не допускающий значения NULL).
Ключевое слово as практически то же самое, что приведение с использованием скобок, за исключением того, что оно не возвращает ошибку, оно устанавливает для объекта значение null:
int i = 1;
object o = i; //boxing
int j = (int)o; //unboxing
Этот первый пример работает, поскольку объект, назначенный для o, является int.
Теперь рассмотрим:
string i = "MyString";
object o = MyString;
int j = (int)o //unboxing raises exception
int j = o as int; //raises compilation Error as int is not nullable
int? j = o as int?; /// o == null
Я надеюсь, что это поможет объяснить разницу между двумя концепциями.
Ричард
int? означает целочисленный тип, допускающий значение NULL, а не int, который может содержать переменные любого другого типа.
Если вам нужен тип переменной, который может содержать int или строку, вам придется использовать объект или строку, я полагаю , а затем жить жизнью, наполненной приведением типов. Но я не знаю, зачем вам это нужно.
int? позволяет хранить любое целочисленное значение или нулевое значение. Это полезно, когда ответ на вопрос «Сколько заказов разместил этот человек» - это законное «Я не знаю» вместо количества заказов или ноль, что означает «Я точно знаю, что этот человек никогда не делал. разместил заказ ».
, но вы можете проверить значение null и установить его на null.
int? blah;
if (blah == null)
{}
Я хочу добавить дополнительную информацию.
Другой случай, почему приведение неверно и компилятор выдает ошибку при компиляции, это System.String имеет маркировку опломбированный . Таким образом, компилятор знает, от каких типов наследуется System.String и к каким типам можно привести строку, используя как -оператор.
Благодаря ключевому слову sealed компилятор также знает, что вы не можете унаследовать от System.String для добавления функций или реализации некоторых дополнительных интерфейсов.
] Приведенный ниже код является примером, и компилятор выдаст следующую ошибку при компиляции
Невозможно преобразовать тип «SealedClass» в 'ICastToInterface' через ссылку конвертация, конвертация бокса, распаковка конвертация, упаковка преобразование или преобразование нулевого типа
public class UnsealedClass {
// some code
}
public sealed class SealedClass {
// some code
}
public interface ICastToInterface {
// some code
}
public class Test {
public Test() {
UnsealedClass unsealedClass = new UnsealedClass();
SealedClass sealedClass = new SealedClass();
ICastToInterface unsealedCast = unsealedClass as ICastToInterface; // This works fine
ICastToInterface sealedCast = sealedClass as ICastToInterface; // This won´t compile, cause SealedClass is sealed
}
}