Я не думаю, что SVG является хорошим выбором для будущего. От Википедия :
Я когда-либо использовал только Class.cast (Object)
, чтобы избежать предупреждений в "области дженериков". Я часто вижу методы, которые делают такие вещи:
@SuppressWarnings("unchecked")
<T> T doSomething() {
Object o;
// snip
return (T) o;
}
Часто лучше заменить его на:
<T> T doSomething(Class<T> cls) {
Object o;
// snip
return cls.cast(o);
}
Это единственный вариант использования Class.cast (Object)
, с которым я когда-либо сталкивался.
] Относительно предупреждений компилятора: я подозреваю, что Class.cast (Object)
не является особенным для компилятора. Его можно было бы оптимизировать при статическом использовании (например, Foo.class.cast (o)
, а не cls.cast (o)
), но я никогда не видел, чтобы кто-нибудь использовал его, что делает попытки встроить эту оптимизацию в компилятор несколько бесполезны.
Во-первых, вам категорически не рекомендуется использовать практически любые заклинания, поэтому вам следует максимально ограничить их! Вы теряете преимущества строго типизированных функций Java во время компиляции.
В любом случае, Class.cast ()
следует использовать в основном, когда вы извлекаете токен Class
через отражение . Более идиоматично писать
MyObject myObject = (MyObject) object
, а не
MyObject myObject = MyObject.class.cast(object)
EDIT: Ошибки во время компиляции
В целом Java выполняет проверки приведения только во время выполнения. Однако компилятор может выдать ошибку, если сможет доказать, что такое приведение не может быть успешным (например, приведение класса к другому классу, не являющемуся супертипом, и приведение последнего типа класса к классу / интерфейсу, не входящему в его иерархию типов). Здесь, поскольку Foo
и Bar
являются классами, которые не находятся в иерархии друг друга,
Всегда проблематично и часто вводить в заблуждение пытаться переводить конструкции и концепции между языками. Кастинг - не исключение. В особенности потому, что Java - это динамический язык, а C ++ несколько отличается.
Все приведение типов в Java, независимо от того, как вы это делаете, выполняется во время выполнения. Информация о типе хранится во время выполнения. C ++ - это немного больше смесь. Вы можете преобразовать структуру в C ++ к другой, и это просто переинтерпретация байтов, которые представляют эти структуры. В Java так не работает.
Также универсальные шаблоны в Java и C ++ сильно отличаются. Не беспокойтесь слишком о том, как вы делаете вещи C ++ в Java. Вам нужно научиться делать что-то в стиле Java.
Class.cast ()
редко когда-либо используется в коде Java. Если он используется, то обычно с типами, которые известны только во время выполнения (т. Е. Через их соответствующие объекты Class
и некоторый параметр типа). Это действительно полезно только в коде, который использует дженерики (по этой же причине он не был введен ранее).
Это не похоже на reinterpret_cast
, потому что он будет ] not позволяет вам нарушить систему типов во время выполнения в большей степени, чем это делает обычное приведение (то есть вы можете «сломать» параметры универсального типа, но не можете «сломать» «реальные» типы).
Зло оператора приведения в стиле C обычно не применяются к Java. Код Java, который выглядит как приведение в стиле C, больше всего похож на dynamic_cast <>
C ++ и Java - это разные языки.
Оператор приведения типов в стиле C Java намного более ограничен, чем версия C / C ++. Фактически преобразование Java похоже на C ++ dynamic_cast, если объект, который у вас есть, не может быть преобразован в новый класс, вы получите исключение времени выполнения (или, если в коде достаточно информации, время компиляции). Таким образом, идея C ++ об отказе от приведения типов C не является хорошей идеей для Java